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