为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠。
但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。
许 多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。
虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。
当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。
另外对于php手册中get_magic_quotes_gpc的举例:

if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}

最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。
再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。
总结一下:
* addslashes() 是强行加;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。
dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace(/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/, &1,这个替换解决了注入的问题,同时也解决了中文乱码的一些问题

三个函数的功能都是给特殊字符转义。
addslashes():
PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。 转义字符有:,,, NULL.
mysql_escape_string():
本函数和 mysql_real_escape_string() 完全一样,除了 mysql_real_escape_string() 接受的是一个连接句柄并根据当前字符集转移字符串之外。mysql_escape_string() 并不接受连接参数,也不管当前字符集设定。此函数不推荐使用,在php6.0将被移除。
mysql_real_escape_string():
本函数将 string 中的特殊字符转义,并考虑到连接的当前字符集,因此可以安全用于mysql_query(),可使用本函数来预防数据库攻击。 转义字符有:x00nr, ,  and x1a
注:
  1. mysql_escape_string(),mysql_real_escape_string() 并不转义 % 和 _。
  2. mysql_real_escape_string 需要 MySQL 数据库连接,因此,在调用 mysql_real_escape_string 之前,必须连接上 MySQL 数据库。

最新文章

  1. [LeetCode] Reverse Bits 翻转位
  2. 【grunt整合版】30分钟学会使用grunt打包前端代码
  3. UVALive 4426 Blast the Enemy! --求多边形重心
  4. Python 批量修改文件名
  5. C#,委托,匿名委托,Lambda表达式
  6. Hbase can't get locations问题
  7. JS 中的foreach和For in比较
  8. Linux gcc编译(动态库,静态库)
  9. c# 值传递 引用传递
  10. c# 委托详解
  11. Dynamics CRM 同一实体多个Form显示不同的Ribbon按钮
  12. Ubuntu18安装Pycharm时遇到的几个问题
  13. PHP 调试打印输出变量
  14. Django框架----路由系统(详细)
  15. Qt中的角度转弧度
  16. KiCad 5.1.0 正式版终于发布
  17. 曾经的超级明星类库jQuery未来也许不再会被前端程序猿追捧了!
  18. aspose.word 使用简单方法
  19. ZZNU 2125:A + B 普拉斯(傻逼题+大数加法)
  20. 进程队列(Queue),Pipe(管道), Manager 进行进程之间的数据传递和传输

热门文章

  1. [转]Nodejs基础中间件Connect
  2. expected an indented block
  3. [canvas]用canvas绘制饼状图
  4. Bash On Win10 (WSL) 安装 Odoo 开发环境
  5. Linux下配置一个VNC服务器
  6. JS中的函数声明错误
  7. USACO翻译:USACO 2014 JAN三题(2)
  8. C#中的简单工厂和单例
  9. ajax同步的实现
  10. javascript 时间格式化