PHP默认设置中对gpc(GET,POST,COOKIE)所提交的数据进行特殊字符转义,防止一些意外情况.
即magic_quotes_gpc = 1
这时会在',", \前面加上\ 对其转义,
如i'm a "dog". 提交后变成=> i\'m a \"dog\".上面的代码检测php.ini中magic_quotes_gpc是否为1,如不是,则手动用函数来进行转义。
同时也对上传的文件变量$_HTTP_POST_FILES进行了一些处理。
即magic_quotes_gpc = 1
这时会在',", \前面加上\ 对其转义,
如i'm a "dog". 提交后变成=> i\'m a \"dog\".上面的代码检测php.ini中magic_quotes_gpc是否为1,如不是,则手动用函数来进行转义。
同时也对上传的文件变量$_HTTP_POST_FILES进行了一些处理。
参数$force=1可强制进行转义
$GLOBALS['magic_quotes_gpc']表示系统的magic_quotes_gpc开关状态,见后续代码。默认是打开的,即由php自动进行转义
function daddslashes($string, $force = 0) {
if(!$GLOBALS['magic_quotes_gpc'] || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}
取得系统的register_globals开关状态
$register_globals = @ini_get('register_globals');
取得系统的magic_quotes_gpc开关状态
$magic_quotes_gpc = @get_magic_quotes_gpc();注意这里!!!
if(!$magic_quotes_gpc) { //如果magic_quotes_gpc开关关闭
exit('Please set magic_quotes_gpc = On in your php.ini.');//退出运行,并提示打开magic_quotes_gpc开关。毛病就在这里!既然要打开magic_quotes_gpc开关,那么函数daddslashes的作用有何在呢?空走一趟?
}注意这里!!!
有上述,既然magic_quotes_gpc开关必然打开,那么!$magic_quotes_gpc就永远为假,何必还写上呢?
if(!$register_globals || !$magic_quotes_gpc) {
以下从http环境数组构造全局变量,以使register_globals开关的设置失效。
@extract(daddslashes($HTTP_POST_VARS), EXTR_SKIP);
@extract(daddslashes($HTTP_GET_VARS), EXTR_SKIP);
if(!$register_globals) {
foreach($HTTP_POST_FILES as $key => $val) {
$$key = $val['tmp_name'];
${$key.'_name'} = $val['name'];
${$key.'_size'} = $val['size'];
${$key.'_type'} = $val['type'];
}
}
}
是不是任何人的代码你都要测试一遍?
有这么多精力吗?
PHP版有这位斑竹真是幸福!!
a.php:<form action="b.php" method="post">
<input type="text" name="abc">
<input type="submit">
</form>b.php:<?
$register_globals = @ini_get('register_globals');
$magic_quotes_gpc = @get_magic_quotes_gpc();if(!$magic_quotes_gpc) {
exit('Please set magic_quotes_gpc = On in your php.ini.');
}if(!$register_globals) {
@extract($HTTP_POST_VARS, EXTR_SKIP);
@extract($HTTP_GET_VARS, EXTR_SKIP);
if(!$register_globals) {
foreach($HTTP_POST_FILES as $key => $val) {
$$key = $val['tmp_name'];
${$key.'_name'} = $val['name'];
${$key.'_size'} = $val['size'];
${$key.'_type'} = $val['type'];
}
}
}
echo $abc;
?>输入123' 输出是123\' 不知道在那里进行转义了?