禁用 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
。
是否可以通过配置选项完全禁用 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
。