我正在使用mysqli准备好的语句。我是否仍应使用以下功能清理用户输入:
function sanitise($string){
$string = strip_tags($string); // Remove HTML
$string = htmlspecialchars($string); // Convert characters
$string = trim(rtrim(ltrim($string))); // Remove spaces
$string = mysql_real_escape_string($string); // Prevent SQL Injection
return $string;
}
感谢。
答案 0 :(得分:8)
没有!不,不。如果您已经在使用预准备语句,MySQL需要查看值,而不是它的某些转义版本。如果您将mysql_real_escape_string
添加到字符串并使其为预准备语句的值,那么您刚刚将其废弃,例如,引号加倍!
现在,就数据清理而言,这完全取决于有效输入是什么或不是什么的业务规则。在您的示例中,strip_tags更多地是关于html->原始(格式)转换而不是卫生。 rtrim(ltrim
也是如此 - 这是一次业务转型。
答案 1 :(得分:2)
是。当使用预准备语句时,您可以安全地进行mysql注入,但仍然可能存在特殊字符,条带标记或空格,因此您仍需要处理这些内容。
请参阅PHP: Is mysql_real_escape_string sufficient for cleaning user input?
更新:
您可以安全地进行mysql注入,因此不应使用real_mysql_scape_string
或任何引号。
答案 2 :(得分:0)
准备好的语句可以防止您的查询表单被恶意输入破坏。但是有很多恶意内容在SQL查询中是完全可以接受的,但是在以后重新显示时会攻击浏览器。
对进入预准备语句的数据执行mysql_real_escape_string通常是多余的(有例外,但它们是特殊情况)。
答案 3 :(得分:0)
这是您的问题的面向对象的解决方案:
public function sanitize($var){
if(is_array($var))
foreach($var as $k => $v) $var[$k] = $this->db->real_escape_string($v);
else
$var = $this->db->real_escape_string($var);
return $var;
}
答案 4 :(得分:-1)
在将用户输入提交到数据库之前,应始终清理用户输入。我会坚持使用mysql_real_escape_string,因为除非你把它们放回到URL上,否则其他的并不是那么必要。