我有网站的会话,这就是我使用它们的方式:
$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更安全?
答案 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_string,prepared-statements或使用其他抽象层。这似乎比CleanMe
安全得多。