小编典典

安全地转义表名/列名

sql

我在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()
);

还是仍然存在一些可以被攻击的途径?


阅读 144

收藏
2021-04-28

共1个答案

小编典典

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

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

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

我认为包含在中INFORMATION_SCHEMA.COLUMNS,因此它们应该只是简单的工作。

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

2021-04-28