4

我在 php 中使用 PDO,因此无法使用准备好的语句转义表名或列名。以下是我自己实现它的万无一失的方法:

$tn = str_replace('`', '', $_REQUEST['tn']);
$column = str_replace('`', '', $_REQUEST['column']);
$sql = "SELECT * FROM `tn ` WHERE `column` = 23";
print_r(
    $pdo->query($sql)->fetchAll()
);

还是还有一些可以攻击的途径?

4

1 回答 1

4

您可以通过询问数据库哪些列对给定数据库表有效来使用动态白名单。这是一个额外的 sql 查询,但安全性很好。

select COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_SCHEMA = :databaseName
  and TABLE_NAME = :tableName

获取结果,然后确保所有动态列名都在结果集中。

我相信视图包含在 中INFORMATION_SCHEMA.COLUMNS,所以它应该只是简单的工作。

然后在组装动态 sql 时只需在经过验证的列名周围使用反引号(我假设您使用纯 ascii 列名,否则您可能需要考虑其他事项)。

于 2012-10-15T01:10:15.200 回答