好的,我发现我不能使用占位符来表名和列
$table = 'users';
$stmt = $db->prepare('SELECT * from ?');
$stmt->bindValue(1, $rable, ??);
那么什么才能真正替代动态表名?
$stmt = $db->prepare('SELECT * from '.$table);
这很容易受到攻击。 escape_string
是否有PDO
方法?我查看了手册,但似乎没有抓到一本。我发现的只有quote
,但这对表和列不起作用。有什么方法可以安全地实现此功能,还是我必须切换回使用mysqli
?
答案 0 :(得分:0)
对于转义字符串
从链接:http://php.net/manual/en/pdo.prepare.php
为将使用不同参数值多次发出的语句调用PDO :: prepare()和PDOStatement :: execute()通过允许驱动程序协商客户端和/或服务器端缓存来优化应用程序的性能查询计划和元信息,并通过消除手动引用参数的需要,有助于防止SQL注入攻击。
准备值仅适用于字段。
关于动态表名称
将表名附加到查询中,就像你在第二个语句中所做的那样。
示例强>
$pdo = new PDO('mysql:host=localhost;dbname=site;',USER,PASS);
$query = $pdo->prepare("DESCRIBE :table");
$query->bindValue(':table', $table, PDO::PARAM_STR, strlen($table));
$query->execute();
while($field = $query->fetch(PDO::FETCH_NUM)){
var_dump($field);
//do something
}
unset($pdo);
答案 1 :(得分:0)
Bindable Marks(?)或Bindable named Marks(:foo)无法显示为表名或(伪动态)字段名。两者都限于字段值。
您应避免在应用程序内部使用动态表。只需将数据库规范化为更灵活,更智能的结构。
答案 2 :(得分:0)
如果您使用刻度线,那么您可以简单地替换用户输入中的刻度,您应该没问题:
$column = 'foo';
$table = 'bar';
$query = 'SELECT ' . $column . ' FROM ' . $table; // Insecure!
$query = 'SELECT `' . str_replace('`', '', $column) . '` FROM `' . str_replace('`', '', $table) . '`'; // Not insecure