' OR '1'='1是 SQL 注入的万能语句,可以通过它轻松改变 SQL 语句的逻辑关系,从而产生背离原 SQL 语句的效果,比如绕过用户密码验证;
假设存在以下用户信息表:
| id | username | password |
|---|---|---|
| 1 | admin | 123456 |
存在以下 sql 语句用于验证username和password是否正确,如正确则存在查询结果,不正确则没有查询结果,表示用户名或密码错误:
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 语句与输入值进组合。