PHP和mySQLi:当使用prepare语句时,我还需要检查用户输入吗?


PHP & mySQLi: Do I still need to check user input when using prepare statements?

如果我在mySQLi中使用prepare语句,我还需要转义或以任何方式检查用户输入吗?例如,如果我的代码是:

$members = new mysqli("localhost", "user", "pass", "members");
$r_email = $_POST['r_email'];
$check = $members->prepare("select user_id from users where email = ?");
$check->bind_param('s', $r_email);
$check->execute();
$check->store_result();
if ($check->num_rows > 0) {
    echo "user already registered";
    $check->close();
}
$members->close();

我是否需要将$r_email = $_POST['r_email']改为$r_email = mysql_real_escape_string($_POST['r_email']);

谢谢。

您不需要使用准备好的语句转义,但是验证用户输入(例如:已填充了必填字段,数字字段包含数值等)

如果要将值作为参数传递,则不需要转义。事实上,你不应该这样做,因为你会在你的数据中插入反斜杠。

在准备时,这些必须是SQL查询的一部分,以便RDBMS可以解析和验证它们。或者在表单中验证用户输入。

总是SQL转义语句中的数据。不要在SQL语句之外使用SQL转义。

不需要转义输入,但不要省略验证,您仍然可能出现逻辑错误,例如提交的空电子邮件,或许多其他副作用,这些副作用可能会回来伤害您。

总是验证,让你在bug测试时保持理智,这是我的座右铭@ least