我知道这是一个非常受欢迎的问题,并且已经研究了很多小时,我仍然对明确的答案有点不确定。我不是 PHP 专业人士,并且已经自学了一段时间。我最近刚刚了解 MYSQLi 准备好的语句(已经习惯了旧的做法)。
我的主要问题是试图找到关于在使用准备好的语句时使用真正的转义字符串(或任何其他安全性)的要求的明确答案。
我已经准备好通过以下问题:
准备好的语句,转义变量 https://stackoverflow.com/questions/17354412/prepared-statements-escape-variables
如果我使用 mysqli 准备好的语句我需要转义吗 https://stackoverflow.com/questions/24716560/if-i-use-mysqli-prepared-statements-do-i-need-to-escape
PHP PDO 准备好的语句需要转义吗? https://stackoverflow.com/questions/3143614/do-php-pdo-prepared-statments-need-to-be-escaped
但在使用准备好的语句时似乎存在支持和反对转义数据的争论。还有很多关于 PDO 的提及,这对我来说非常令人困惑,因为我不是 PHP 天才。
我期待这个伟大的社区帮助我完全理解并给我一个答案(以我希望理解的方式),以便我取得进步。
为此,我有以下示例,并询问是否有人可以用通俗易懂的术语解释使用哪些,不使用哪些,更重要的是,为什么?
我目前在我的代码中使用它:
$id = $conn->real_escape_string($_POST['id']);
$name = $conn->real_escape_string($_POST['name']);
$message = $conn->real_escape_string($_POST['message']);
$qry = $conn->prepare('INSERT INTO status (id, name, message, date) VALUES (?, ?, ?, NOW())');
$qry->bind_param('iss', $id, $name, $message);
$qry->execute();
$qry->close();
但是,我对上述示例问题的有限理解告诉我,使用以下代码是安全/可以的:
$qry = $conn->prepare('INSERT INTO status (id, name, message, date) VALUES (?, ?, ?, NOW())');
$qry->bind_param('iss', $_POST['id'], $_POST['name'], $_POST['message']);
$qry->execute();
$qry->close();
那么,哪种方法是最好的方法呢?抱歉问了这么长的问题。在研究并试图理解它之后,我只想确定并理解其原因。
感谢大家的时间和支持,我将非常感谢所提供的任何帮助。