2010-11-10 121 views
0

我已经在我的网站的每个页面上的任何其他东西之前运行的类进行了清理。我非常确定addslashes与使用mysql_real_escape_string转义类继承相同。这个php代码保护我从SQL注入和XSS?

class sanatize 
{ 
private static $singleton; 

function __construct(){ 

    $_CLEAN_POST = array(); 
    $_CLEAN_GET = array(); 
    $_CLEAN_REQUEST = array(); 

    foreach($_REQUEST as $key => $value) 
    { 
     $key = addslashes(trim(strip_tags($key))); 
     $value = addslashes(trim(strip_tags($value))); 

     $_CLEAN_REQUEST[$key] = $value; 
    } 
    foreach($_GET as $key => $value) 
    { 
     $key = addslashes(trim(strip_tags($key))); 
     $value = addslashes(trim(strip_tags($value))); 

     $_CLEAN_GET[$key] = $value; 
    } 
    foreach($_POST as $key => $value) 
    { 
     if(is_array($value)){ 
      foreach($value as $key2 => $value2){ 

       $key2 = addslashes(trim(strip_tags($key2))); 
       $value2 = addslashes(trim(strip_tags($value2))); 

       $_CLEAN_POST[$key][$key2] = $value2; 
      } 
     } 
     else{ 
      $key = addslashes(trim(strip_tags($key))); 
      $value = addslashes(trim(strip_tags($value))); 

      $_CLEAN_POST[$key] = $value; 
     } 
    } 
    $_POST = array(); 
    $_GET = array(); 
    $_REQUEST = array(); 

    $_POST = $_CLEAN_POST; 
    $_GET = $_CLEAN_GET; 
    $_REQUEST = $_CLEAN_REQUEST; 
} 
function __destruct() 
{ 
    //echo "cleaned"; 
} 

public static function getInstance() 
{ 
    if(is_null(self::$singleton)) 
    { 
     self::$singleton = new sanatize(); 
    } 
    return self::$singleton; 
} 
} 

,然后我会用

$sanatize = sanatize::getInstance(); 
+2

'和addslashes()'不相同的方式工作的'mysql_real_escape_string()' – stillstanding 2010-11-10 04:51:00

+3

这仅仅是一个坏主意各地。它不等同于mysql_real_escape_string,并且您不希望在每个请求中为每个变量添加斜杠 - 它们并不都是进入数据库查询,并且您可能想要更改或显示其中一些值。 – 2010-11-10 04:58:43

+0

@你能否详细说明一下? – Brian 2010-11-10 04:58:55

回答

7

称它为“我敢肯定和addslashes相同与mysql_real_escape_string继承人类逃脱。”

首先,它不是。 mysql_real_escape_string知道连接,并将连接的字符集考虑在内。

其次,你基本上复制失败magic_quotes设计。并非所有这些字段都会进入数据库,因此您正在做不必要的工作。您还必须小心,永远不要在“干净”的阵列中重新排除某些东西;双逃避是一个非常普遍的问题。

在我看来,SQL注入最简单的办法是准备好的语句。我建议使用PDOmysqli

编辑:既然你已经使用mysqli的,你应该忘记这种清洁的想法,简单地使用MySQLi_STMTmysqli::prepare给出了如何创建变量并将其绑定到预准备语句的示例。请注意0​​占位符。也看看mysqli_stmt::bind_param

+0

+1 magic_quotes的。如果它打开然后结果是意想不到的一个... – KoolKabin 2010-11-10 05:10:05