首页 > 解决方案 > FORM 身份验证页面中的 SQL 注入

问题描述

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 Server 是如何解释上述两条 SQL 语句的?

WHERE该子句始终为真的场景有哪些?

标签: sql-serversql-injection

解决方案


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

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


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

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


推荐阅读