http://php.net/manual/en/pdo.prepared-statements.php
如果应用程序专门使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入).
某些输入未被转义的可能情况是什么?如果所有其他输入都使用PDO进入数据库,这是否可能?
我正在考虑使用mysql_*函数处理其他输入而不使用mysql_real_escape_string进行转义的情况.还有什么可能是威胁吗?
非常感谢.问候
这意味着您不能直接使用不受信任的值,例如作为列或表名称 - 或作为LIMIT参数.
例如,这是安全的:
$query = "SELECT * FROM tbl WHERE col = ?";
Run Code Online (Sandbox Code Playgroud)
虽然这些不是:
$query = 'SELECT * FROM tbl WHERE col = ? LIMIT ' . $_GET['limit'];
$query = 'SELECT * FROM tbl WHERE ' . $_GET['field'] . ' = ?';
$query = "SELECT * FROM tbl WHERE col = ? AND othercol = '" . $_GET['other'] . "'";
$query = 'SELECT * FROM ' . $_GET['table'] . ' WHERE col = ?';
Run Code Online (Sandbox Code Playgroud)
基本上,预处理语句的占位符旨在用于您在经典查询中使用单引号内的转义值的位置.
如果您想知道为什么数据库通常不支持表名等事物的占位符:除了动态表/列名称不常见之外,数据库引擎通常会在准备好时自动优化准备好的语句.然而,如果不确切地知道访问哪些表/列,则无法正确地完成此操作.