This question already has answers here:
How can I prevent SQL injection in PHP?
(28个答案)
5年前关闭。
prepare()对于我的大多数代码来说似乎有点乏味和不必要。如果我在一个SQL命令中发送一个字符串,为什么我不能用real_escape_string清除它呢?有什么区别?这就是我一直在做的事情,它对SQL注入很有效。。。谢谢。

最佳答案

在SQL注入防御中,转义和使用查询参数一样有效。
如果你不能始终如一地做到这两种方法,它们的效果也会降低。
这两种方法仅用于保护SQL表达式中的单个值。它们不支持查询的其他动态部分。例如,如果要按用户指定的列排序。查询参数和转义函数都不能处理这个问题。
所以基本上,这是一个风格和个人喜好的问题。
我更喜欢查询参数,因为我认为:

$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$a, $b, $c]);

更清楚的是:
$sql = "INSERT INTO mytable (columna, columnb, columnc) VALUES ('".mysqli_real_escape_string($conn, $a)."', '".mysqli_real_escape_string($conn, $b)."', '".mysqli_real_escape_string($conn, $c)."')";
mysqli_query($conn, $sql);

您不必认真地说,摆弄所有这些开引号/闭引号和.字符串连接比使用prepare()和查询参数更容易。
重新评论一个带有参数的假设query()函数。
首先,这是没有必要的。同时使用prepare()和execute()是编写安全代码的一个很小的代价,而通过坚持使用单个函数来完成这项工作,您听起来很懒。我想您也不会检查错误时返回false的函数的返回值吧?
值得一提的是,编写一个包装器函数来同时执行这两个操作是很容易的,因为PHP隐式地支持varargs。
function myquery() {
  global $pdo;
  $params = func_get_args();
  $sql = array_shift($params);
  $stmt = $pdo->prepare($sql);
  $stmt->execute($params);
  return $stmt; // so we can fetch(), etc.
}

关于php - real_escape_string和prepare()之间的区别? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20909553/

10-16 09:21