我们知道,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=addslashes(htmlspecialchars($key));
- }
- else{
- $key=addslashes($key);
- }
- if(is_array($v))
- {
- $value[$key]=addslashes_deep($v);
- }
- else{
- if($htmlspecialchars==true)
- {
- $value[$key]=addslashes(htmlspecialchars($v));
- }
- else{
- $value[$key]=addslashes($v);
- }
- }
- }
- }
- else{
- if($htmlspecialchars==true)
- {
- $value=addslashes(htmlspecialchars($value));
- }
- else{
- $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);