禁用MySQL的UNION SELECT查询

时间:2018-08-06 20:12:54

标签: mysql sql sql-injection

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

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

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

3 个答案:

答案 0 :(得分:1)

使用普通的SELECT查询也很容易执行SI,并且与UNION完全无关。而且,据我所知,没有这样的选项可以禁用UNION,除非您可能已获取开源代码并自行对其进行了修改。

答案 1 :(得分:1)

要明确回答您的问题:

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

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

但是,通常来说,除非禁用代码编辑器并修改MySQL的SQL解析器代码,然后构建MySQL的自定义实例,否则您不能禁用SQL关键字或子句。

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

答案 2 :(得分:0)

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

使用“ Prepared Statements”和 apply 参数而不是连接这些参数更为安全。

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