加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 安全地转义表名/列名

发布时间:2020-12-13 17:13:43 所属栏目:PHP教程 来源:网络整理
导读:我在php中使用PDO,因此无法使用预处理语句转义表名或列名.以下是自己实施它的万无一失的方法: $tn = str_replace('`','',$_REQUEST['tn']);$column = str_replace('`',$_REQUEST['column']);$sql = "SELECT * FROM `tn ` WHERE `column` = 23";print_r( $pd
我在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列名,否则您可能有其他注意事项).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读