关于php的magic_quotes_gpc
今天暂时没有任务,偷偷关注一下安全方面的东东。上午回味了一下安全天使的两篇经典文章
http://www.4ngel.net/article/36.htm
http://www.4ngel.net/article/30.htm
总结出两点:
1。无论如何(即使magic_quotes_gpc=On还是可以采用char()等函数进行注射)数字型变量(SQL语句中没有用引号包围的变量)一定要进行过滤,常用intval()函数处理,
2。字符型变量(SQL语句中用引号包围的变量):
当 magic_quotes_gpc=Off 时一定要进行过滤,常用addslashes()函数处理。
当 magic_quotes_gpc=On 时程序会自动进行转义处理,注射成功的可能性较小,但也有一些程序会自动去掉magic_quotes_gpc造成的影响,造成可以继续注射。
因此为了安全起见,允许对php进行配置的话magic_quotes_gpc尽量设置成On,如果是虚拟主机的话只能尽量在程序上避免出问题了。
关于各种情下magic_quotes_gpc对数据库操作的影响总结如下:
1. 对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2. 对于magic_quotes_gpc=off 的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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不是数组,那么就仅处理一次 $content = addslashes($content); } } else { //如果magic_quotes_gpc=On,那么就不处理 } //返回$content return $content; } |
写的挺好的。
赞!
[回复]
飘(piao2010) 回复:
4月 16th, 2010 at 13:45
谢谢支持,你的博客内容挺不错的。
[回复]