get_magic_quotes_gpc()
这个应该算是个常识性问题了,php5.4之前这个函数返回默认值是 1,之后就0了,也就是说php5.4之后,php不会给你传递的$_GET、$_POST、$_COOKIE、$_REQUEST变量自动转义了。
这里的转义意思是主要是:反斜线(\)、单引号(’)、双引号(”)、NUL(这个我没复现过,估计用js可以实现吧)
Note:
如果 magic_quotes_sybase 也是 ON,它会完全覆盖 magic_quotes_gpc。 两个指令都启用意味着只有单引号被转义为 ”。 双引号、反斜杠和 NUL’s 不会被转义。 如果启用了magic_quotes_sybase,单引号会被单引号转义而不是反斜线。
所以,如果需要对所有的字符字符进行过滤的话,有个好办法:
<?php
/** * This setting was removed in PHP 5.4, but get_magic_quotes_gpc * always returns False since then. * 自动给加转义 */ define( 'QUOTES_GPC', get_magic_quotes_gpc() ); define( 'QUOTES_SYBASE', ini_get( 'magic_quotes_sybase' ) );
if ( QUOTES_GPC && QUOTES_SYBASE || !QUOTES_GPC) {
PMA_arrayWalkRecursive($_GET, 'addslashes', true);
PMA_arrayWalkRecursive($_POST, 'addslashes', true);
PMA_arrayWalkRecursive($_COOKIE, 'addslashes', true);
PMA_arrayWalkRecursive($_REQUEST, 'addslashes', true);
}
echo $_GET['s'];
function PMA_arrayWalkRecursive(& $array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = 0;
$walked_keys = array();
if (++$recursive_counter > 1000) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
if (isset($walked_keys[$key])) {
continue;
}
$walked_keys[$key] = true;
if (is_array($value)) {
PMA_arrayWalkRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
$walked_keys[$new_key] = true;
}
}
}
$recursive_counter--;
}