我在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()
);
或者是有还是有些大道,这可以被攻击?
您可以通过询问数据库中的哪些列是有效的给定的数据库表使用动态白名单。 这是一个额外的SQL查询,但安全性好。
select COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = :databaseName
and TABLE_NAME = :tableName
取的是结果,然后只是确保所有的动态列名的结果集。
我相信视图包括在INFORMATION_SCHEMA.COLUMNS
,所以应该都只是普通的工作。
然后组装动态SQL时,只需使用周围的验证列名反引号(我假设你使用纯ASCII列名,否则,你可能有额外的考虑)。