是否可以通过配置选项完全禁用UNION SELECT
查询?
除了清理入口参数外,我还想避免使用UNION
,因为借助它的帮助,很容易实现以下形式的SQL injection
:
SELECT * FROM users where username = '1' OR 1=1
UNION
SELECT * FROM users -- ' AND password='something'
答案 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语句时不要将值连接为字符串。