SQL注入漏洞成因在于Web应用程序对用户提交CGI参数数据未做充分检查过滤。用户提交的数据可能会被用来构造访问后台数据库的SQL指令,如果这些数据过滤不严格就有可能被插入恶意的SQL代码,从而非授权操作后台的数据库,导致从敏感信息泄露、破坏数据库内容和结构、甚至利用数据库本身的扩展功能控制服务器操作系统。利用SQL注入漏洞可以构成对Web服务器的直接攻击,还可能利用服务器攻击第三方的浏览网站的其他用户。
例如:
$sql = "select * from user where name='".$_POST['name']."' and password='".$_POST['password']."'";
正常情况下为:
select * from user where name='admin' and password='admin'
注入情况下:
select * from user where name='admin'//' and password='123'
name传来的值为:admin'//
我们现在项目中用的是mysql的 mysql_real_eacape_string()函数过滤传来的参数
其他来源:
<?php
class BaseGeneral {
public static function Escape($string, $force = 0, $htmlspecialchars) { $htmlspecialchars && $string = self::EscapeToHtml($string); if(!get_magic_quotes_gpc() || $force) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = self::Escape($val, $force); } } else if(is_object($string)) { foreach($string as $key => $val) { $string[$key] = self::Escape($val, $force); } } else { $string = addslashes($string); } } return $string; } public static function EscapeToHtml($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = self::EscapeToHtml($val); } } else if (is_object($string)) { foreach($string as $key => $val) { $string->$key = self::EscapeToHtml($val); } } else { $string = htmlspecialchars($string, ENT_QUOTES, 'GB2312'); } return $string; }
}
?>
//调用 BaseGeneral::Escape($string,$force=0,true);
先对传入的参数进行取值(直到是字符串为止),然后进行单引和双引的转实体操作,再判断magic_quotes_gpc是否为on
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
- 单引号 (')
- 双引号 (")
- 反斜杠 (\)
- NULL
stripcslashes() 函数删除由 addcslashes() 函数添加的反斜杠。(正常情况下这个不需要加)