SQL 在 FORM 身份验证页面中注入

SQL Injection in FORM Authentication pages

SELECT *
FROM admin_table
WHERE username = '' OR '1'='1' AND password = '';

SELECT *
FROM admin_table
WHERE username = '' OR 1=1 OR '1'='1' AND password = '';

SQL 服务器如何解释上述两个 SQL 语句?

在什么情况下 WHERE 子句总是 True?

  1. WHERE 如果 username 为空,或者( 1=1(即。真)并且 password 为空),则为真,因此其中一个必须为空
  2. WHERE 如果 username 为空,或 1=1,或( 1=1 且 password 为空)则为真,因此始终为真。

真正的解决方案是不是通过清理或编写奇怪的查询来尝试并战胜SQL注入。解决方案是将代码和数据分开。代码被执行,数据没有。因此,始终 参数化您的查询。


在我个人看来,SQL 作为一种语言面临的最大问题是它鼓励在任何地方混合代码和数据的临时解释脚本。

如果代码必须在 到达数据库附近之前完全编译,注入就不会成为这样的问题。