更具安全性的addslashes_deep函数-by Sodoit


我们知道,ecshop的很多漏洞都是因为对变量的过滤不严格而导致mysql注入的,虽然在init.php文件里有对
$_GET,$_GET,$_COOKIE,$_REQUEST用addslashes_deep进行处理,但是,分析addslashes_deep函数后我们就可以发现,
该函数只处理数组的值,对数组的key是完全不作任何过滤的,这直接导致了漏洞。

为此,我们应该重写addslashes_deep函数,下面是我的代码:

function addslashes_deep($value,$htmlspecialchars=false)
{
if (empty($value))
{

return $value;
}
else
{

if(is_array($value)){
foreach($value as $key => $v){
unset($value[$key]);
if($htmlspecialchars==true){
$key=get_magic_quotes_gpc()? addslashes(stripslashes(htmlspecialchars($key,ENT_NOQUOTES))) : addslashes(htmlspecialchars($key,ENT_NOQUOTES));
}
else{

$key=get_magic_quotes_gpc()? addslashes(stripslashes($key)) : addslashes($key);
}
if(is_array($v))
{

$value[$key]=addslashes_deep($v);
}else{
if($htmlspecialchars==true)
{
$value[$key]=get_magic_quotes_gpc()? addslashes(stripslashes(htmlspecialchars($v,ENT_NOQUOTES))) : addslashes(htmlspecialchars($v,ENT_NOQUOTES));
}
else{
$value[$key]=get_magic_quotes_gpc()? addslashes(stripslashes($v)) : addslashes($v);
}
}

}
}

else{

if($htmlspecialchars==true){
$value=get_magic_quotes_gpc()? addslashes(stripslashes(htmlspecialchars($value,ENT_NOQUOTES))) : addslashes(htmlspecialchars($value,ENT_NOQUOTES));

}

else{

$value=get_magic_quotes_gpc()? addslashes(stripslashes($value)) : addslashes($value);
}
}
return $value;
}
}

该函数对数组的值和key都进行了addslashes处理,并且根据需要,还可以进行htmlspecialchars过滤。在init.php文件里,应该这样调用:
$_GET = addslashes_deep($_GET,true);
$_POST = addslashes_deep($_POST,true);
$_COOKIE = addslashes_deep($_COOKIE,true);
$_REQUEST = addslashes_deep($_REQUEST,true);


相关文档
最新文档