从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?
Posted
技术标签:
【中文标题】从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?【英文标题】:How to handle special characters in SQL table name when generating SQL from PHP? 【发布时间】:2021-10-13 12:40:12 【问题描述】:我正在开发一个 php 工具来执行一些数据库操作。我现在面临一个问题。如果表名包含特殊字符,我无法进行正确的查询,我知道这种情况很少见。
例如请看下面的查询
INSERT INTO `@#$%."'"12-.+/_*-ttr*` (`id`, `obj`, `value`)
VALUES (NULL, 'hi', 'ttt');
我想为 PHP 变量 $table_name
分配一个表名,并且我想执行这个查询。
$query= "insert in to `$table_name` " (`id`, `obj`, `value`)
VALUES (NULL, 'hi', 'ttt')
如何正确地将表名分配给 $table_name?由于表名中的特殊字符,我遇到了错误。
请注意,我给出的表名非常少见,但我想让我的代码适用于所有情况。
这个问题的版权从他的morphed question 转到Abilash Erikson。 我打开了一个新问题以保留我的答案,截至meta comments
【问题讨论】:
为什么你想要一个包含所有这些奇怪字符的表名,你为什么要为自己制作问题 【参考方案1】:根据docs,您可以在所使用的刻度内使用几乎任何字符。
标识符在内部转换为 Unicode。它们可能包含 这些字符:
不带引号的标识符中允许的字符: ASCII:[0-9,a-z,A-Z$_](基本拉丁字母,数字 0-9,美元,下划线) 扩展:U+0080 .. U+FFFF
带引号的标识符中允许的字符包括完整的 Unicode 基本多语言平面 (BMP),但 U+0000 除外: ASCII:U+0001 .. U+007F 扩展:U+0080 .. U+FFFF
要将表名放入查询中,您可以像这样进行字符串连接:
$query = "insert into `" . $table_name . "` (`id`, `obj`, `value`) VALUES (NULL, 'hi', 'ttt');";
注意:这是非常危险的,因为如果可以从用户(管理面板,...)控制表名,它会打开 SQL 注入的攻击面
为了防止这种情况,只需从表名中转义所有刻度 `(因为所有其他字符都被允许和封装)
$table_name = str_replace("`","``", $table_name);
$query = "insert into `" . $table_name . "` (`id`, `obj`, `value`) VALUES (NULL, 'hi', 'ttt');";
小提琴可以看here
【讨论】:
以上是关于从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章
Wordpress SQL 默认搜索,如何处理 SQL 注入