' OR '1'='1是 SQL 注入的万能语句,可以通过它轻松改变 SQL 语句的逻辑关系,从而产生背离原 SQL 语句的效果,比如绕过用户密码验证;

假设存在以下用户信息表:

id username password
1 admin 123456

存在以下 sql 语句用于验证usernamepassword是否正确,如正确则存在查询结果,不正确则没有查询结果,表示用户名或密码错误:

SELECT id FROM test.user 
WHERE username='admin' and password='123456';

当输入的用户名为admin,密码为123456 时存在查询结果,表示用户名与密码输入正确;

可是,永远不要相信用户的输入;因为用户可以构建特殊的值来实现 SQL 注入,从而改变原语句的效果,且看:

SELECT id FROM test.user 
WHERE username='admin' and password='' OR '1'='1';

password值为' OR '1'='1 时,这个 SQL 语句的 WHERE 条件因为OR '1'='1'总是为真,导致返回表中所有用户的id,完全绕过了用户名和密码的验证。

这就是一个典型的通过 SQL 注入绕过用户名与密码验证的过程!

如何防范SQL注入

永远不要相信用户的输入;要对用户的输入进行验证和过滤,使用参数化查询;

不要使用字符串拼接的方式将 sql 语句与输入值进组合。