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,基本就是安如盘石了
- <?php
- //假如从表单提交一个变量$_POST["message"],内容为 Tom"s book
- //这此加入衔接MySQL数据库的代码,自己写吧
- //在$_POST["message"]的敏感字符前加上反斜杠
- $_POST["message"] = addslashes($_POST["message"]);
- //由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠
- $sql = "INSERT INTO msg_table VALUE("$_POST[message]");";
- //发送恳求,把内容保存到数据库内
- $query = mysql_query($sql);
- //假如你再从数据库内提取这个记录并输出,就会看到 Tom\"s book
- ?>
这样的话,在magic_quotes_gpc=On的环境里,全部输入的单引号(")城市变成(\")……
其实我们可以用get_magic_quotes_gpc()函数简单地办理这个问题.当magic_quotes_gpc=On时,该函数返回 TRUE;当magic_quotes_gpc=Off时,返回FALSE.至此,必定已经有不少人意识到:问题已包办理.请看代码:
- <?php
- //假如magic_quotes_gpc=Off,那就为提单提交的$_POST["message"]里的敏感字符加反斜杠
- //magic_quotes_gpc=On的情形下,则不加
- if (!get_magic_quotes_gpc()) {
- $_POST["message"] = addslashes($_POST["message"]);
- } else {}
- ?>
其实说到这里,问题已包办理.下面再说一个小本领.
有时表单提交的变量不止一个,大概有十几个,几十个.那么一次一次地复制/粘帖addslashes(),能否麻烦了一点?由于从表单或URL获得的数据都是以数组情势呈现的,如$_POST、$_GET) 那就自定义一个可以“横扫千军”的函数:
- <?php
- function quotes($content)
- {
- //假如magic_quotes_gpc=Off,那么就开始处理
- if (!get_magic_quotes_gpc()) {
- //判断$content能否为数组
- if (is_array($content)) {
- //假如$content是数组,那么就处理它的每一个单无
- foreach ($content as $key=>$value) {
- $content[$key] = addslashes($value);
- }
- } else {
- //假如$content不是数组,那么就仅处理一次
- addslashes($content);
- }
- } else {
- //假如magic_quotes_gpc=On,那么就不处理
- }
- //返回$content
- return $content;
- }
- ?>
以上是“PHP中避免SQL注入攻击办法[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |