我用这个:
function safeClean($n)
{
$n = trim($n);
if(get_magic_quotes_gpc())
{
$n = stripslashes($n);
}
$n = mysql_escape_string($n);
$n = htmlentities($n);
return $n;
}
防止任何类型的MySQL注入或类似的东西。每当我用它来包裹$ _POST时就像这样:
$username = safeClean($_POST['user']);
$password = md5(safeClean($_POST['password']));
$vpassword = md5(safeClean($_POST['verify']));
$email = safeClean($_POST['email']);
它甚至不起作用,但是我附加了functions.php并且目录是正确的但是根本不起作用,因为它只显示一个空白页...如果我从每个$ _POST中删除safeClean()它有效。
为什么这根本不起作用?
答案 0 :(得分:7)
在我看来,这种一般的消毒方法并不是思考问题的最佳方式。首先,参数化查询(可能最方便使用PDO)是解决SQL安全问题的更好方法。但一般 ......
我知道开发人员的冲动是尝试减少你必须考虑的事情。所以,当然,你想知道你是否可以提出一个通用的消毒功能,你只需将所有输入交给,而不必再担心。输入是一个竞技场,但如果你真的想要安全性,你需要特别考虑每个传入的数据应该是什么以及它最终会在哪里。如果你在这里继续自动驾驶,你将在某些时候引入安全问题。
答案 1 :(得分:4)
尝试使用mysql_real_escape_string()
而不是mysql_escape_string()
。
答案 2 :(得分:2)
代码中的几乎所有内容都是错误的。
get_magic_quotes_gpc是错位的,htmlentities是错误的,甚至术语“清理”被滥用。
事实上,您不应该为数据库清理任何内容。但只需遵循语法规则即可 看一下非常相似的问题,我已经很好地解释了SQL问题:In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
从空白页开始,你必须学习调试入门。您必须打开错误报告才能看到错误消息而不是空白页。首先,您可以参考这篇文章: 链接开始:http://www.ibm.com/developerworks/library/os-debug/
你可以从你的cript顶部添加这些行开始
ini_set('display_errors',1);
error_reporting(E_ALL);
和查询执行的代码:
$result = mysql_query($query);
if (!$result) trigger_error(mysql_error());