1 什么是 SQL 注入?

所谓 SQL 注入,便是指黑客将 SQL 代码嵌入在输入参数之中,在未经过滤的情况下直接拼接到 SQL 语句之中进行解析并执行的一种攻击方法。

2 一个 SQL 注入的简单例子

我们来模拟一个登录场景,大家平时登录网站什么之类的需要啥呢?没错,账号密码!于是,我们的登录界面一般都是这个样子。。。


当我们输入账号密码按下回车之后,会向后台返回账号密码两个参数。

https://mail.qq.com?username=3030&password=1010

然后在后台相当于调用了下面的 SQL 语句:

SELECT * FROM user WHERE username = '3030' AND password = '1010'

好,上面老实人一般都会正常输入账号密码,但总是有一些不法分子存在非分之想,他们会这么输入账号密码:


在后台,执行的 SQL 语句变成了下面这条:

SELECT * FROM user WHERE username = '3030'#' AND password = '1010'

在 MySQL 中,# 之后的所有字符串都会被当成注释进行处理,其实上面的 SQL 语句与下面这一条等价:

SELECT * FROM user WHERE username = '3030'

我们可以发现,只需要在账号后面加上 '# 两个字符,然后我们便可以随便输入密码,因为最终会被注释掉。在这种情况下,我们只需要知道别人的账号,即可不需要密码进行登录操作,这是一个非常严重的安全问题!

3 SQL 注入的条件

经过一个例子,我们来总结一下 SQL 注入的产生条件:

  1. 存在参数传递
  2. 参数值带入 SQL 语句查询并且执行

4 如何防止 SQL 注入攻击?

在上面的例子中我们可以发现,SQL 注入攻击实在太可怕了!那么,我们又该如何防止 SQL 注入攻击呢?一般我们可以采取以下方法:

  1. 对输入变量的类型与格式进行检查。如果参数类型为整数,则加上必要的判断;如果参数类型为字符串,则使用正则表达式进行过滤操作(账号必须为 [0-9a-zA-Z] 范围内的字符串)
  2. 对特殊字符进行过滤和转义。例如对 ’ 或 " 或 \ 等特殊字符进行转义
  3. 使用 MySQL 的预编译机制

什么是预编译?

一般 SQL 语句的执行可以分为以下三个过程:

  1. 词法和语义解析
  2. 优化 SQL 语句,制定执行计划
  3. 执行并返回结果

这种是一般情况,但是我们在某些场景下可能存在 SQL 语句反复执行或者每次执行只有个别值不同的情况,如果每次执行都要重新经过上面三个步骤,显然效率是非常不可观的,幸好预编译机制可以有效解决这个问题。

预编译机制将 SQL 语句中的值用占位符替代,可以理解为将 SQL 语句模板化或者参数化。使用预编译,我们便可以一次编译、多次运行,省去了解析,优化等过程,另外使用预编译机制也可以有效防止 SQL 注入。

问题来了,为什么预编译机制可以防止 SQL 注入呢?使用预编译机制,我们后台的 SQL 语句就可以抽象为:

SELECT * FROM user WHERE username = ? AND password = ?

在该语句中,无论用户输入何种账号密码,逻辑关系始终为 AND,不会导致 SQL 语句结构发生变化。参数值是参数值,语句是语句,参数的值并不是语句的一部分,MySQL 只按语句的语义来执行 SQL。

5 Mybatis 如何防止 SQL 注入?

MyBatis 是我们常用的持久层框架,其 SQL 均需要我们手动编写,那么它又是如何防止 SQL 注入的呢?

在编写映射语句时,使用 #{} 会进行预编译处理,其 SQL 语句类似于下面的格式:

SELECT * FROM user WHERE username = ? AND password = ?

SQL 执行时,会直接将占位符 ?替换为参数,自然不会存在 SQL 注入的问题。

参考:SQL注入攻击常见方式及测试方法
SQL注入详解

BOSS:你连什么是 SQL 注入都不知道,我怎么给你加薪?相关推荐

  1. 常见基础注入类型-SQL注入-web安全

    下面还是以sql-labs漏洞测试平台来介绍下其他的常见注入,在之后我们会找一些在线靶场来检验下效果如何. 1.时间盲注 MySQL基于时间盲注的原理分析,注入SQL语句执行后不提示真假,也不能通过页 ...

  2. Web安全之Sql注入漏洞

    Sql注入漏洞 SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行. ...

  3. sql注入之堆叠注入

    一.堆叠注入的原理 mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔 开,而堆叠注入其实就是通过结束符来执行多条sql语句 比如我们在 ...

  4. jsp 防止sql注入 之 preparestatement篇(转载)

    在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement. 基于以下的原因: 一.代码的可 ...

  5. 同事都说有SQL注入风险,我非说没有

    前言 现在的项目,在操作数据库的时候,我都喜欢用ORM框架,其中EF是一直以来用的比较多的:EF 的封装的确让小伙伴一心注重业务逻辑就行了,不用过多的关注操作数据库的具体细节.但是在某些场景会选择执行 ...

  6. 不会SQL注入,连漫画都看不懂了

    先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了.今天我们来聊一聊SQL注入相关的内容. 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段 ...

  7. 每个互联网人才都应该知道的SQL注入

    我们都是善良的银!一生戎码只为行侠仗义,知道这个不是为了做啥非法的事,只是知道小偷怎么偷东西才能更好地防范. SQL注入(SQL Injection),SQL注入即是指web应用程序对用户输入数据的合 ...

  8. SQL注入漏洞入门介绍

    文章目录 一.SQL注入危害 1.1 实例 1.2 危害 二.SQL注入含义 2.1 含义 2.2 白话 三.实操学习所需 3.1 靶机环境搭建 3.2 SQL相关语法 3.2.1 SQL基本查询语法 ...

  9. 在sqli-liabs学习SQL注入之旅(第二十一关~第三十关)

    二十一关 打开这一关,开屏暴击.报错的大致意思是时区没有设置好,我们进入报错的文件,在php代码中加入中国时区的代码即可: date_default_timezone_set("PRC&qu ...

最新文章

  1. 图像拼接--Construction and Refinement of Panoramic Mosaics with Global and Local Alignment
  2. 熟练掌握python是什么概念-Quant面试时说:熟练掌握Python,请三思,不然凉凉~
  3. 计算机网络第六章:应用层
  4. C#根据execl批量修改图片名称
  5. 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
  6. linux postgres恢复数据库,从纯文本格式的备份文件恢复数据库
  7. Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini以及服务无法启动的解决办法以及修改初始密码的方法...
  8. js 中的class
  9. python基础语法实验报告小结_Python基础小结
  10. Python 函数参数 传引用还是传值
  11. JSTL 学习、应用记录
  12. Unity URP/SRP 渲染管线浅入深出【匠】
  13. mongovue mysql_MongoDB 客户端 MongoVue(转)
  14. JavaEE高级框架学习笔记(八)Struts高级ActionForm
  15. 西门子PLC S7-200数字量扩展模块
  16. Kyrie Irving邀请粉丝加入Lineage Logistics的Share A Meal运动,帮助受COVID-19疫情影响的人们
  17. wireshark的usb抓包分析 2 - 分析数据
  18. QR分解、RQ分解与SVD
  19. Linux 安装node.js 16
  20. 一步一步学Spring Boot(一)

热门文章

  1. 图像的EXIF信息简介及获取!
  2. 听自己喜欢的文章-【睿读】
  3. Linux入门【第二回】 基本指令(相对路径,绝对路径)
  4. 5.2万个!5G上市企业专利最新排行!
  5. 决策树①——信息熵信息增益基尼系数
  6. 六部门发布38条举措支持民企改革发展转型升级
  7. comboBox控件下拉选项中添加图片
  8. 考研词汇复习:记忆不牢固的单词
  9. dplyr count 函数
  10. uniapp的导航栏自定义返回路径