关于sql注入

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() 函数添加的反斜杠。(正常情况下这个不需要加)

原文地址:https://www.cnblogs.com/zhaozhilu/p/2944293.html