我在 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 列名称,否则您可能需要额外考虑)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)