【问题标题】:My function vs Mysql_real_escape_string我的函数与 Mysql_real_escape_string
【发布时间】:2012-04-04 13:46:56
【问题描述】:

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

   $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 是否更安全?

【问题讨论】:

  • 这些值从何而来?它们是否用于数据库查询?如果它们被用于数据库查询,请使用mysql_real_escape_string,不要重新发明轮子。
  • 对于初学者,您的CleanMe() 函数可能应该使用str_ireplace() 来区分大小写;虽然我建议最好不要重新发明轮子,而只使用mysql_real_escape_string()
  • 值是用户拥有的用户名和密码。
  • 所以如果用户的密码是“dropselect”,它会作为“”进入你的数据库吗?这对我来说似乎不是一个好主意。 mysql_real_escape_string() 的编写有很多原因,其中一个原因是这样的函数没有被编写。
  • 你指的是什么其他类型的攻击?

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


【解决方案1】:

尽可能地重用已有的功能; mysql_real_escape_string 在这种情况下。您很可能忘记了 CleanMe 中的某些内容,这使其不安全。您只需要忘记一个字符串即可使其不安全,并且您现在可能不知道该字符串是什么。

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

【讨论】:

  • 谢谢西蒙。我经常被告知,简单地使用 mysql_real_escape_string 不会削减它。所以我不确定,但你认为使用 mysql_real_escape_string();会做吗?我正在使用 htmlspecialchars 来防止 xss 攻击。
  • 这是两种不同类型的攻击:向数据库中插入恶意查询(mysql_real_escape_string 防止这种情况发生)和输出非预期的脚本代码(htmlspecialchars 防止这种情况发生)。所以简短的回答是你需要两者:一个来保护数据库,另一个来保护代码不被运行在你网站访问者的机器上。
  • 好的,所以在插入数据库时​​我使用 mysql_real_escape_string();并显示它使用 htmlspecialchars(); ?
  • 是的。在显示用户输入的内容(例如来自用户输入字段的 cmets、帖子或其他数据)时,您可以使用 htmlspecialchars。在将其放入数据库之前,您需要使用mysql_real_escape_string
  • 在下面查看我对该答案的评论。
【解决方案2】:

尽管你的Cleanme() 函数完全没有意义, mysql_real_escape_string() 函数也没有成功(在这种情况下)。

你不应该使用它们中的任何一个!

出于任何“清洁”的目的。

mysql_real_escape_string() 并非旨在“清理”任何东西

但只是格式化字符串。

当你需要这个函数时,尽管“清理”你还是需要它,但这只是因为 SQL 语法需要它。 而在你不需要它的地方,转义对你没有帮助甚至一点。

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

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

在安全问题上取决于此功能,相信它会“清理”您的数据最终导致您进行注入。

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

准备好的陈述也不是灵丹妙药。它仅在一半可能的情况下覆盖您的背部。详情见important addition I made to the famous question

【讨论】:

  • 不应该使用mysql_real_escape_string 的大字体会让刚接触这些主题的人感到困惑。 mysql_real_escape_string 应该使用 是的,确切地说,它不会“清理”字符串,它只会转义引号。 mysql_real_escape_string 不会从您的字符串中删除内容(这是很好的评论),但说不应该使用它是完全错误的。
【解决方案3】:

您可以使用mysql_real_escape_stringprepared-statements 或使用另一个抽象层。这似乎比CleanMe 更安全。

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多