我正在使用 PDO 包来管理我的应用程序数据库。
我用PDO::prepare
, PDOStatement::execute
有时PDO::quote
, PDO::query / PDO::exec
执行我的查询
是PDO::prepare
和 PDO::quote
完全安全?或者我应该做更多的工作来正确验证我的输入。不仅对于数据库而且对于 php 代码
谢谢
最佳答案
使用prepare()
并没有什么神奇之处。您可以将不安全变量插入字符串中,然后准备该字符串。 Boom——SQL 注入(inject)。准备一份声明并不意味着它就安全。
$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = {$_POST['id']}"); // UNSAFE!
使用参数使其安全。
$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = ?");
$stmt->execute([$_POST['id']]); // SAFE!
人们自然会说“使用准备好的语句”,因为您必须使用准备好的语句才能使用参数。但仅仅说“使用准备好的语句”有点没有捕获重点,一些开发人员产生了错误的理解。
<小时/>PDO quote() 方法也很安全,但我发现它更简单且更容易使用参数。
$idQuoted = $pdo->quote($_POST['id']);
$stmt = $pdo->prepare("SELECT * FROM MyTable WHERE id = $idQuoted");
关于php - PDO::prepare 和 PDO::quote 完全安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44446229/