我正在使用PDO包来管理我的应用程序数据库。
我使用PDO::prepare
,PDOStatement::execute
和somtimes PDO::quote
,PDO::query / PDO::exec
来执行我的查询
PDO::prepare
和PDO::quote
是否完全安全?或者我应该做更多工作来正确验证我的输入。不仅仅是数据库,还有php代码
谢谢
答案 0 :(得分:2)
使用prepare()
没有什么神奇之处。您可以将不安全的变量插入到字符串中,然后准备该字符串。 Boom-SQL注入。准备一份陈述并不能确保安全。
$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");