[php] magic_quotes
(一)magic_quotes_gpc
php提供了一个magic_quotes_gpc的选项,可以让用户输入的内容(比如$_POST或者$_GET以及cookie)中的’、”、\、和NULL的前面自动加上转义字符(“\”)。这个选项的本意很好,可以避免我们忘记转义而导致安全问题。但是在实际使用时往往带来不小的麻烦。
如果这个是一直开着的,那么一点问题都没有。但是这是一个选项,服务器可以选择on或者off。当设置成on的时候,在我们写的php代码中就不需要也不应该再使用addslashes等转义函数了。如果是off,当然就必须自己进行转义(如果不转义,就有SQL 注入的危险)。
所以解决的方法是先使用get_magic_quotes_gpc()判断该选项是否打开。
如果已经打开了,将自动加上的slashes去掉。
然后使用mysql的转义函数进行转义。如果你的数据库不支持,也可以使用addslashes函数进行转义。
function array_map_recursive($callback, $array)
{
$r = array();
if (is_array($array))
foreach($array as $key => $value)
$r[$key] = is_scalar($value) ?
$callback($value) :
array_map_recursive($callback, $value);
return $r;
}
function array_stripslashes($array)
{
return array_map_recursive('stripslashes', $array);
}
if (get_magic_quotes_gpc())
{
$_GET = array_stripslashes($_GET);
$_POST = array_stripslashes($_POST);
$_COOKIE = array_stripslashes($_COOKIE);
}
function myescape($string) {
return mysql_real_escape_string( $string );
}
function add_magic_quotes($array) {
foreach ($array as $k => $v) {
if ( is_array($v) ) {
$array[$k] = add_magic_quotes($v);
} else {
$array[$k] = myescape($v);
}
}
return $array;
}
(二)magic_quotes_runtime
magic_quotes_runtime =on时,php在提取数据(包括从文件,数据库)时就会自动在' " \前加上转义符"\"。



Comments
No comments yet.