我还应该用mysqli消毒输入吗?

时间:2011-03-09 00:23:27

标签: php

我正在使用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;
}

感谢。

5 个答案:

答案 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上,否则其他的并不是那么必要。