sql注入详细解释

sql注入是什么?

sql是我们操作数据库与其交互的语言,而sql注入是用户将Web页面的原URL、表单域或数据包输入的参数,修改拼接成sql语句,传递给Web服务器,进而传给数据库服务器。由于程序编写人员对于提交到数据库的请求没有进行验证和过滤导致拼接的sql语句被执行很有可能导致数据库的数据被获取,这就叫sql注入攻击。

上面说的 可能有一点复杂,其实sql注入简单来说就是将sql语句添加到输入的参数当中传递到数据库执行的一种攻击手段

sql注入的危害

1、可以获取到数据库的信息

2、可以修改信息

3、可以安装木马

4、可以执行系统命令

sql注入的几种方式

数字型注入

当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数id=8,PHP会自动推导变量id的数据类型为int类型,那么id=8 and 1=1,则会推导为string类型,这是弱类型语言的特性。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

假如我们查询一个用户的信息 sql语句应该是

select * from user where user_id=1

但是如果我们发送的请求是

 select * from user where user_id=1 or 1=1 

那么我们这个就算是一个sql注入攻击了,会返回我们所有用户的信息。

为什么呢?

因为1=1永远是true,where条件相当于没有了

字符串注入

用mysql举栗子,MySQL中有两种注释方法

1、’#’:’#'后所有的字符串都会被当成注释来处理
用登录来说,我们登录一般是

select * from user where userName= 'user' and pwd='123'

但是当我们传入的参数是user’#(单引号闭合user左边的单引号),密码随便输入一个,就会#后面都被注释掉

select * from user where userName= 'user'# and pwd='123'

那么我们就可以直接无密码或者密码错误也能登录到该用户的账号
2、’-- ’ (–后面有个空格):’-- ‘后面的字符串都会被当成注释来处理
当我们输入参数user’-- (注意–后面有个空格,单引号闭合user左边的单引号),密码也随便输入

SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'

这样子也可以无密码或者密码错误但是成功登录到该用户的账号

关于mybatis中传递变量用#的原因

在MyBatis中,如果写${变量名},则为直接把传入的值填充到SQL语句中;
如果写#{变量名},则为传入的值只能作为值,放到SQL语句中。

举例:
DELETE FROM student WHERE name=${stu_name}
如果这样写,假如用户恶意传入这样一个字符串:'abc' OR 1=1,
那么整个SQL就变成了
DELETE FROM student WHERE name=abc OR 1=1,
结果就是全部数据都删掉了。这就是SQL注入,如果把${stu_name}换成#{stu_name},那么依然传入上面的字符串,
那么SQL是这样的:
DELETE FROM student WHERE name=`abc OR 1=1`,会删除名字为abc OR 1=1的学生
没有这个学生则什么都删除不掉,这样就防止了SQL注入。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在Web应用程序的输入字段中注入恶意SQL代码,从而绕过应用程序的安全验证,获取敏感数据或者执行非授权的操作。下面是一段可能会引起SQL注入的代码片段: ```python username = request.POST.get('username') password = request.POST.get('password') sql = "SELECT * FROM user WHERE username='%s' AND password='%s'" % (username, password) result = conn.execute(sql) ``` 在这段代码中,程序从请求中获取用户名和密码,并将它们插入到一个SQL语句中,最后执行这个SQL语句来查询数据库。如果攻击者在用户名或密码中注入了SQL代码,就可能会导致SQL注入漏洞,例如: ```python username = "admin'; DROP TABLE user;--" password = "123456" sql = "SELECT * FROM user WHERE username='%s' AND password='%s'" % (username, password) result = conn.execute(sql) ``` 在这个例子中,攻击者在用户名中插入了一个SQL注入攻击代码,这个攻击代码包含一个 DROP TABLE user 的SQL语句,这会导致用户表被删除。 为了防止SQL注入攻击,我们需要对输入参数进行过滤和转义,将特殊字符进行转义,例如: ```python import pymysql def query_user(username, password): conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='test') cursor = conn.cursor() sql = "SELECT * FROM user WHERE username=%s AND password=%s" cursor.execute(sql, (username, password)) result = cursor.fetchall() cursor.close() conn.close() return result ``` 在这个例子中,我们使用了pymysql库的参数化查询方法,将输入参数作为参数传递给execute()方法,而不是将它们直接插入到SQL语句中。这样就可以避免SQL注入攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值