从 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 表名中的特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Envers 时如何处理 Flyway 迁移?

Wordpress SQL 默认搜索,如何处理 SQL 注入

使用 DataGridView 控件和 Access 数据库查询时如何处理错误?

[当PHP代码失败但发送200时如何处理AJAX?

从 watchkit 请求数据时如何处理这个错误

如何处理 pl/sql 块中的编译时异常?