如何将MySQL中安全转义表字段名的正确实践转化为一个长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计763个文字,预计阅读时间需要4分钟。
在+
在构建动态 SQL 语句时,尤其是当列名(如 ORDER BY, WHERE 条件字段、SELECT 字段)需由用户输入决定时,开发者常误以为“只要用反引号包裹就万事大吉”。但事实并非如此:反引号仅用于标识符(identifier)的语法分隔,它不提供任何过滤或转义能力。例如:
$name = $_GET['user-input']; // 假设传入:`id` = '1' OR '1'='1` $sql = "SELECT * FROM users WHERE `$name` = 'someUsername'"; // 实际执行可能变成: // SELECT * FROM users WHERE `id` = '1' OR '1'='1` = 'someUsername'
更危险的是,攻击者可构造如 `username` -- ` 或嵌套反引号配合注释符(#、--、/* */),绕过简单字符串检查,甚至注入任意 SQL 片段。你代码中 str_contains('')` 的校验逻辑本身就有缺陷——它只检查是否含反引号,却未阻止恶意内容;且未处理空值、空白符、Unicode 零宽字符等边缘情况。
✅ 正确做法是:严格使用白名单(Whitelist)校验列名。
本文共计763个文字,预计阅读时间需要4分钟。
在+
在构建动态 SQL 语句时,尤其是当列名(如 ORDER BY, WHERE 条件字段、SELECT 字段)需由用户输入决定时,开发者常误以为“只要用反引号包裹就万事大吉”。但事实并非如此:反引号仅用于标识符(identifier)的语法分隔,它不提供任何过滤或转义能力。例如:
$name = $_GET['user-input']; // 假设传入:`id` = '1' OR '1'='1` $sql = "SELECT * FROM users WHERE `$name` = 'someUsername'"; // 实际执行可能变成: // SELECT * FROM users WHERE `id` = '1' OR '1'='1` = 'someUsername'
更危险的是,攻击者可构造如 `username` -- ` 或嵌套反引号配合注释符(#、--、/* */),绕过简单字符串检查,甚至注入任意 SQL 片段。你代码中 str_contains('')` 的校验逻辑本身就有缺陷——它只检查是否含反引号,却未阻止恶意内容;且未处理空值、空白符、Unicode 零宽字符等边缘情况。
✅ 正确做法是:严格使用白名单(Whitelist)校验列名。

