我在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()
);
或者还有一些可以攻击的途径吗?
答案 0 :(得分:4)
您可以通过询问数据库哪些列对给定数据库表有效来使用动态白名单。这是一个额外的SQL查询,但安全性很好。
select COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = :databaseName
and TABLE_NAME = :tableName
获取结果,然后确保所有动态列名都在结果集中。
我认为观点包含在INFORMATION_SCHEMA.COLUMNS
中,因此它应该只是简单的工作。
然后在组装动态sql时只使用经验证的列名称周围的反引号(我假设你使用纯粹的ascii列名,否则你可能有其他注意事项)。