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

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


    1. function addslashes_deep($value,$htmlspecialchars=false)
    2. {
    3. if (empty($value))
    4. {
    5. return $value;
    6. }
    7. else
    8. {
    9. if(is_array($value))
    10. {
    11. foreach($value as $key => $v)
    12. {
    13. unset($value[$key]);
    14. if($htmlspecialchars==true)
    15. {
    16. $key=addslashes(htmlspecialchars($key));
    17. }
    18. else{
    19. $key=addslashes($key);
    20. }
    21. if(is_array($v))
    22. {
    23. $value[$key]=addslashes_deep($v);
    24. }
    25. else{
    26. if($htmlspecialchars==true)
    27. {
    28. $value[$key]=addslashes(htmlspecialchars($v));
    29. }
    30. else{
    31. $value[$key]=addslashes($v);
    32. }
    33. }
    34. }
    35. }
    36. else{
    37. if($htmlspecialchars==true)
    38. {
    39. $value=addslashes(htmlspecialchars($value));
    40. }
    41. else{
    42. $value=addslashes($value);
    43. }
    44. }
    45. return $value;
    46. }
    47. }

    该函数对数组的值和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);