关于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;
}

相关日志

  1. beeboo 说:

    写的挺好的。
    赞!

    [回复]

    飘(piao2010) 回复:

    谢谢支持,你的博客内容挺不错的。

    [回复]

  1. There are no trackbacks for this post yet.

Leave a Reply