复制代码 代码如下: function jk1986_checksql() { $bad_str = “and|select|update|’|delete|insert|*”; $bad_Array = explode(“|”,$bad_str); /** 过滤Get参数 **/ foreach ($bad_Array as $bad_a) { foreach ($_GET as $g) { if (substr_count(strtolower($g),$bad_a) > 0) { echo “[removed]alert(‘诡异字符,请不要尝试注入本站! 作者:Jk1986 QQ:4140
在IT行业中,数据库的安全性是至关重要的,尤其是对于运行PHP的网站来说,SQL注入是一种常见的攻击手段,能够让攻击者执行恶意SQL语句,获取、修改甚至删除敏感数据。本篇文章将详细探讨PHP通用防注入程序的原理和实现,以及如何在PHP中防范这种攻击。
SQL注入通常发生在开发人员未对用户输入进行充分验证或转义时,攻击者可以通过在表单字段中输入特定的SQL语句片段来欺骗服务器执行非预期的操作。例如,一个不安全的查询可能会如下所示:
```php
$sql = "SELECT * FROM users WHERE username = '".$_POST['username']."' AND password = '".$_POST['password']."'";
```
如果用户输入`username`为`admin' OR '1'='1 --`,那么拼接后的SQL语句会变成:
```sql
SELECT * FROM users WHERE username = 'admin' OR '1'='1' --' AND password = '...
```
这将导致所有用户的记录被返回,因为`'1'='1'`始终为真。为了防止这种情况,我们可以使用PHP中的防注入策略。
推荐的PHP防注入程序,如文中代码所示,采用了一个名为`jk1986_checksql()`的函数,它主要通过以下几个步骤来过滤可能的恶意输入:
1. **定义危险字符集**:定义一个字符串`$bad_str`,包含了SQL注入常用的关键词,如`and`, `select`, `update`, `’`(单引号),`delete`, `insert`, `*`等。
2. **拆分危险字符集**:使用`explode()`函数将这些关键词用管道符号(`|`)分隔成数组`$bad_Array`。
3. **遍历并检查GET、POST和COOKIE参数**:函数分别对`$_GET`, `$_POST`和`$_COOKIE`全局变量进行遍历,检查每个参数是否包含危险字符。如果发现含有匹配的关键词,立即终止脚本并显示警告信息,避免执行含有恶意SQL的请求。
这个防注入方法虽然简单有效,但它并不完美。一方面,它依赖于预定义的危险字符列表,可能无法覆盖所有复杂的SQL注入方式;另一方面,它没有处理SQL语句中的特殊字符转义,例如,单引号`'`应该被转义为`\ '`。此外,该方法可能会误报,比如用户正常输入中可能包含这些关键词,导致合法请求被拦截。
更强大的防注入策略可以采用预处理语句(Prepared Statements)和参数绑定,如PDO或MySQLi扩展提供的功能。这种方式能够确保即使用户输入包含SQL语句片段,也不会被执行。例如:
```php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $_POST['username']);
$stmt->bindParam(':password', $_POST['password']);
$stmt->execute();
```
预处理语句使得SQL语句模板和参数分离,确保参数不会被解释为SQL命令的一部分。
除了SQL注入,文章还提到了XSS(跨站脚本攻击)的防护。XSS攻击允许攻击者在目标网页上执行恶意JavaScript,通常通过注入带有脚本的用户输入。防范XSS攻击的方法包括对用户输入进行转义、过滤或编码,以及设置HTTPOnly Cookie以保护Cookie免受JavaScript访问。
PHP的防注入和XSS防护涉及多个层面,包括但不限于输入验证、转义、预处理语句以及正确处理用户输入。开发者应时刻关注代码安全,避免因忽视安全而导致的数据泄露或其他安全问题。