当前位置:七道奇文章资讯网站建设网站编程
日期:2009-09-03 09:13:00  来源:本站整理

PHP中避免SQL注入攻击办法[网站编程]

赞助商链接



  本文“PHP中避免SQL注入攻击办法[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

SQL injection问题在ASP上但是闹得沸沸扬扬 当然还有不少国内外闻名的PHP程序“罹难”.至于SQL injection的详情,网上的文章太多了,在此就不作介绍.
假如你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内容大概含有敏感字符,如单引号("),就招致了SQL injection的漏洞.在这种情形下,我们可以用addslashes()来办理问题,它会自动在敏感字符前增添反斜杠.
但是,上面的办法只实用于magic_quotes_gpc=Off的情形.作为一个开辟者,你不知道每个用户的magic_quotes_gpc是On 还是Off,假如把全部的数据都用上addslashes(),那不是“草菅性命”了?假定magic_quotes_gpc=On,并且又用了 addslashes()函数,那让我们来看看:

我来总结一下
恶行之源:用户提交过来的数据是坚固的.
用户可以假造表单和URL提交他想提交的任何数据
假如你把他提交过来的数据变量直接联入sql语句就会造成注入
普通性的防备办法是:
全部sql语句必须用单引号,因为单引号内的字符串只有两个特别,它自己和转义符,只要搞定这两个就ok了,而addslashes完好胜任
php.ini里magic_quotes_gpc默许是off的
有的是on的,这就需求在利用addslashes之前ini_get一下看这个设置是on还是off然后再决意能否用
mysql的sql语句的构成中普通只有整形和字符型,整形加上引号也不会出错,假如嫌麻烦就全加上引号,更安全一点就是inval()转化成整形.

这样处理基本就没问题了,至于能否答应提交html代码看你要求了,不答应的话就用函数去掉<>

更安全一点的遍历post,get,cookie,对他们的长度举行掌握,addslashes,去除html(或转化成&),图片考证码,表单的http refferring、session_id判断,更高级的是表单过期判断(普通用某个常量和时间算出的hash,提交的时刻再考证这个hash).

随着$_POST类变量的遍及利用,php的安全性得到了很大提高,再注意一下单引号和addslashes,基本就是安如盘石了 

 

  1. <?php 
  2. //假如从表单提交一个变量$_POST["message"],内容为 Tom"s book  
  3. //这此加入衔接MySQL数据库的代码,自己写吧  
  4. //在$_POST["message"]的敏感字符前加上反斜杠  
  5. $_POST["message"] = addslashes($_POST["message"]);  
  6.  
  7. //由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠  
  8. $sql = "INSERT INTO msg_table VALUE("$_POST[message]");";  
  9.  
  10. //发送恳求,把内容保存到数据库内  
  11. $query = mysql_query($sql);  
  12.  
  13. //假如你再从数据库内提取这个记录并输出,就会看到 Tom\"s book  
  14. ?> 

 这样的话,在magic_quotes_gpc=On的环境里,全部输入的单引号(")城市变成(\")……
其实我们可以用get_magic_quotes_gpc()函数简单地办理这个问题.当magic_quotes_gpc=On时,该函数返回 TRUE;当magic_quotes_gpc=Off时,返回FALSE.至此,必定已经有不少人意识到:问题已包办理.请看代码: 

  1. <?php 
  2. //假如magic_quotes_gpc=Off,那就为提单提交的$_POST["message"]里的敏感字符加反斜杠  
  3. //magic_quotes_gpc=On的情形下,则不加  
  4. if (!get_magic_quotes_gpc()) {  
  5. $_POST["message"] = addslashes($_POST["message"]);  
  6. } else {}  
  7. ?> 


 其实说到这里,问题已包办理.下面再说一个小本领.
有时表单提交的变量不止一个,大概有十几个,几十个.那么一次一次地复制/粘帖addslashes(),能否麻烦了一点?由于从表单或URL获得的数据都是以数组情势呈现的,如$_POST、$_GET) 那就自定义一个可以“横扫千军”的函数: 

  1. <?php 
  2. function quotes($content)  
  3. {  
  4. //假如magic_quotes_gpc=Off,那么就开始处理  
  5. if (!get_magic_quotes_gpc()) {  
  6. //判断$content能否为数组  
  7. if (is_array($content)) {  
  8. //假如$content是数组,那么就处理它的每一个单无  
  9. foreach ($content as $key=>$value) {  
  10. $content[$key] = addslashes($value);  
  11. }  
  12. } else {  
  13. //假如$content不是数组,那么就仅处理一次  
  14. addslashes($content);  
  15. }  
  16. } else {  
  17. //假如magic_quotes_gpc=On,那么就不处理  
  18. }  
  19. //返回$content  
  20. return $content;  
  21. }  
  22. ?> 

  以上是“PHP中避免SQL注入攻击办法[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • PHP中文件包含语句的辨别
  • 怎样用PHP中的MySQL操作函数
  • PHP中操作MySQL的一些要注意的问题
  • PHP中操作MySQL的需注意的问题
  • php中返回查询数据集四种办法
  • php中超级简单文件上传代码
  • php中返回ascii值函数odr
  • php中常用hash加密函数
  • php中正则获得url函数preg_match
  • PHP中文URL编解码具体阐明
  • php中的反斜杠/
  • PHP中的PDO函数库详解
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .