0

好的,我刚刚发现我不能对表名和列使用占位符

$table = 'users';

$stmt = $db->prepare('SELECT * from ?');
$stmt->bindValue(1, $rable, ??);

那么拥有动态表名的真正替代方法是什么?

$stmt = $db->prepare('SELECT * from '.$table);

这将是脆弱的。有escape_string方法PDO吗?我浏览了手册,但似乎没有抓住一个。我发现的只是quote但这不适用于表和列。有什么方法可以安全地实现此功能,还是必须切换回使用mysqli

4

3 回答 3

0

If you use ticks, then you can simply replace ticks in the user input, and you should be fine:

$column = 'foo';
$table = 'bar';

$query = 'SELECT ' . $column . ' FROM ' . $table; // Insecure!

$query = 'SELECT `' . str_replace('`', '', $column) . '` FROM `' . str_replace('`', '', $table) . '`'; // Not insecure
于 2013-12-07T18:18:52.700 回答
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);
于 2013-12-07T17:42:09.377 回答
0

可绑定标记 (?) 或可绑定命名标记 (:foo) 不能显示为表名或(伪动态)字段名。两者都仅限于字段值。

您应该避免在应用程序中使用动态表。只需将您的数据库规范化为更敏捷和智能的结构。

于 2013-12-07T17:42:09.837 回答