SQL注入万能语句' or 1='1详解

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

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

id username password
1 hello world

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

SELECT * FROM test.user WHERE username='hello' and password='world';

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

可是,永远不要相信用户的输入;因为上面这条SQL语句存在SQL注入漏洞,且看:

SELECT * FROM test.user WHERE username='' or 1='1' and password='anyxxxxx';

当username值为' or 1='1时,SQL语句的逻辑表达式结构被修改了,因为 or 1='1' ,致使不论密码是否正确,其验证都将通过;

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

如何防范SQL注入

永远不要相信用户的输入;要对用户的输入进行过滤和参数化;

永远不要使用以下方法组合SQL语句:

sql = `SELECT * FROM test.user WHERE username='` + username + `' and password='` + password + `';`

原创内容,如需转载,请注明出处;

本文地址: https://www.perfcode.com/p/sql-injection-statement.html

分类: 计算机技术
推荐阅读:
提示Permission denied的解决方法 通常,提示Permission denied表示你的某个操作权限不够;在Linux系统中,权限分为读权限、写权限和可执行权限,当你所在的用户组没有相关权限时,则会提示Permission denied;
python @staticmethod装饰器 @staticmethod 是一个装饰器,用于声明一个静态方法。静态方法是一个属于类而不是属于实例的方法,可以直接通过类名调用,而不需要创建实例。
配置Nginx实现简单的反盗链 本文通过Nginx的配置指令valid_referers来实现简单的图片和其它类型文件的防盗链。
Python int()函数 在Python中,int()函数用于将一个数值或字符串转换为整数。如果提供了一个字符串作为参数,那么int()函数将尝试将该字符串解释为一个整数,并返回对应的整数值。如果字符串无法解释为整数,则会引发ValueError异常。
MySQL INTERVAL 时间间隔表达式 时间间隔表达式表示一个时间的间隔,通常用于时间的计算;语法如下:
Python enumerate()函数 在Python中,enumerate()是一个内置函数,用于将一个可迭代对象转换为一个枚举对象,该对象包含每个元素的索引和对应的值。enumerate()函数返回的是一个由元组组成的迭代器,每个元组包含两个元素,第一个元素是元素的索引,第二个元素是元素的值。