禁用 MySQL 的 UNION SELECT 查询

Disable MySQL's UNION SELECT query

是否可以通过配置选项完全禁用 UNION SELECT 查询?

除了清理入口参数外,我想避免使用 UNION 因为在它的帮助下很容易实现 SQL injection 的形式:

SELECT * FROM users where username = '1' OR 1=1 
UNION 
SELECT * FROM users -- ' AND password='something'

即使使用普通 SELECT 查询也很容易进行 SI,而且它与 UNION 完全无关。此外,据我所知,不,没有这样的选项来禁用 UNION 除非你可能使用了开源代码并自己修改了它。

避免 SQL 注入的最佳 [已证实] 解决方案是通过将字符串与来自最终用户界面(或其他不安全来源)的值连接起来来避免组装 SQL 语句。

使用 "Prepared Statements" 和 apply 参数比 concatenating 这些参数更安全。

仍有空间将 SQL 块连接成语句,主要是在使用动态 SQL 时,但我认为这超出了您的问题范围。简而言之:在生成 SQL 语句时不要将值连接为字符串

简单回答你的问题:

不,MySQL 中没有选项可以选择性地禁用 UNION

SQL_MODE 可用于在一些非常特殊的情况下更改语法的含义,例如使用双引号和 || 运算符。参见 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html

但一般来说,您不能禁用 SQL 关键字或子句,除非您拿出代码编辑器并修改 MySQL 的 SQL 解析器代码,然后构建自定义MySQL.

的实例

我同意其他评论者的观点,如果您使用已知做法编写应用程序代码以避免 SQL 注入漏洞,则没有必要禁用 UNION