我的函数vs Mysql_real_escape_string

时间:2012-04-02 19:34:35

标签: php security mysql-real-escape-string

我有网站的会话,这就是我使用它们的方式:

   $username = CleanMe($_SESSION["username"]);
   $password = CleanMe($_SESSION["password"]);

   //return clean values
   $_SESSION["username"] = $username;
   $_SESSION["password"] = $password;

CleanMe是:

       function CleanMe($strWords){ 
       $bad_string = array("select", "drop", ";", "--", "insert","delete", 
       "xp_", "%20union%20", "/*", "*/union/*", "+union+", "load_file", 
       "outfile", "document.cookie", "onmouse", "<script", "<iframe", "<applet", 
       "<meta", "<style", "<form", "<img", "<body", "<link", "_GLOBALS", "_REQUEST", 
       "_GET", "_POST", "include_path", "prefix", "http://", "https://", 
       "ftp://", "smb://", "'", "\""); 
       for ($i = 0; $i < count($bad_string); $i++){ 
       $strWords = str_replace ($bad_string[$i], "", $strWords); 
       } 
       return $strWords; 
       }

现在,使用mysql_real_escape_string或我拥有的是否有意义,CleanMe更安全?

3 个答案:

答案 0 :(得分:3)

尽可能多地重用现有功能;在这种情况下mysql_real_escape_string。你很可能忘记了CleanMe中的某些东西,这使得它变得不安全。你只需要忘记一个字符串就可以使它不安全,你可能不知道现在是什么字符串。

请记住:攻击者有足够的时间并且只能让它正确一次,但开发人员每次都需要做对。所以我们的教训是:不要让自己更难,并正确使用和应用现有的功能。

答案 1 :(得分:1)

尽管您的Cleanme()函数完全没有意义, mysql_real_escape_string()函数也没有(在此上下文中)。

你不应该使用其中任何一个!

用于“清洁”的目的。

mysql_real_escape_string()无意“清理”任何内容

但仅仅是格式化字符串。

每当你需要这个功能时,你需要它尽管“清理”,但只是因为它是SQL语法所必需的。而你不需要的地方,逃避不会帮助你甚至有点。

此功能的使用很简单:当您必须在查询中使用带引号的字符串时,您必须转义它的内容。不是因为一些想象的注入,而是仅仅是为了逃避用于分隔字符串的这些引号。这是一个非常简单的规则,但却被PHP人员误解了。

这只是语法相关的功能,与安全无关。

根据安全事项中的此功能,相信它会“清理”您的数据最终导致您注射。

保护您的查询免受注入是一项更复杂的任务。有关详细信息,请参阅此complete explanation

准备好的陈述也不是一个灵丹妙药。它仅涵盖了一半可能的案件。有关详细信息,请参阅important addition I made to the famous question

答案 2 :(得分:0)

您可以使用mysql_real_escape_stringprepared-statements或使用其他抽象层。这似乎比CleanMe安全得多。