从网上搜索的资料,结合自己的理解整理了一下,网友们在查看时若有发现问题,还请不吝指正,谢谢!

1、什么是SQL注入?

——官方说法:把SQL命令插入到web表单验证的输入框中,提交到服务器,以达到越过数据验证的目的。

——通俗说法:在浏览器的某个网页中,在身份验证框或者数据查询框中,通过输入sql命令,影响SQL语句字符串的拼接,从而使原本执行不通过的SQL语句可以执行通过。

2、如何进行SQL注入?

——拼接SQL字符串:

比如在网站的登录页面中,在用户名输入框中输入“or 1=1 --”,密码输入框中不输入,然后点击“登录”按钮,对于一些安全防护做的不太好的网站,可能就直接登进去了,应该叫做非法登录了。举例如下:

后台进行登录验证的代码如下:(网上截的图,主要看SQL字符串的拼接那块。)

验证用户登录的sql 如下:

 select COUNT(*) from Users where Password = 'a' and UserName = 'b' 

这段代码返回Password 和UserName都匹配的用户数量,如果大于1的话,那么就代表用户存在。

  SQL注入:我们在用户名UserName输入框中,输入“b' or 1=1 --”(注意:“--”是SQL SERVER中的注释,其他数据库注释标识可能不同),

  然后原来的SQL语句就变成了:select COUNT(*) from Users where Password = 'a' and UserName = 'b' or 1=1 --',

  实际执行的SQL语句是:select COUNT(*) from Users where Password = 'a' and UserName = 'b' or 1=1,因为后面的注释了。

 这样这个SQL语句就变成了恒成立的,所以只要Users表中有数据,执行结果就是大于等于1的。
这样SQL注入就成功了。 3、如何防止SQL注入?
————参数化查询。
具体方法:
后台代码如下:

这里我的理解是,通过参数化,把用户的输入信息中的单引号进行了转义,从而使每一个输入信息都作为一个单独的字符串,比如像上面的“b' or 1=1 --”经过参数化处理后,就变成了“b'' or 1=1 --”,那么就不会改变原来SQL语句的语义了。

可以看到参数化查询主要做了这些事情:

1:参数过滤,可以看到 @UserName='b'' or 1=1—'
2:执行计划重用

因为执行计划被重用,所以可以防止SQL注入。

最后,分析SQL注入的本质:

用户写了一段SQL 用来表示查找密码是a的,用户名是b的所有用户的数量。

通过注入SQL,这段SQL现在表示的含义是查找(密码是a的,并且用户名是b的,) 或者1=1 的所有用户的数量。

可以看到SQL的语意发生了改变,为什么发生了改变呢?,因为没有重用以前的执行计划,因为对注入后的SQL语句重新进行了编译,因为重新执行了语法解析。所以要保证SQL语义不变,即我想要表达SQL就是我想表达的意思,不是别的注入后的意思,就应该重用执行计划。

如果不能够重用执行计划,那么就有SQL注入的风险,因为SQL的语意有可能会变化,所表达的查询就可能变化。

任何动态的执行SQL 都有注入的风险,因为动态意味着不重用执行计划,而如果不重用执行计划的话,那么就基本上无法保证你写的SQL所表示的意思就是你要表达的意思。
这就好像小时候的填空题,查找密码是(____) 并且用户名是(____)的用户。
不管你填的是什么值,我所表达的就是这个意思。 
最后再总结一句:因为参数化查询可以重用执行计划,并且如果重用执行计划的话,SQL所要表达的语义就不会变化,所以就可以防止SQL注入,如果不能重用执行计划,就有可能出现SQL注入,
存储过程也是一样的道理,因为可以重用执行计划。

另外,对于上面说的“重用执行计划”这个词不太明白,准备在下一次继续学习整理一下。
												

对于SQL注入的理解的更多相关文章

  1. SQL注入个人理解及思路(包括payload和绕过的一些方式)

    首先本文主要是把我对SQL注入的一些坑和最早学习SQL注入的时候的一些不理解的地方做一个梳理. (本文仅为个人的一点皮毛理解,如有错误还望指出,转载请说明出处,大佬勿喷=.=) 什么是SQL注入呢? ...

  2. 防止sql注入和sqlmap介绍

    sql注入问题从WEB诞生到现在也一直没停过,各种大小公司都出现过sql注入问题,导致被拖库,然后存在社工库撞库等一系列影响. 防止sql注入个人理解最主要的就一点,那就是变量全部参数化,能根本的解决 ...

  3. sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)

    (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...

  4. 常见web漏洞的整理之SQL注入

    SQL注入: 简介: 全称Structured Query Language,即结构化查询语言,是一种特殊的编程语言,用于数据库中的标准数据查询语言.也被作为关系式数据库管理系统的标准语言. 原理: ...

  5. 二阶SQL注入理解与体会

    一:SQL注入分类 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 二:二者进行比较 0x01:一阶SQL注入: 1:一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻 ...

  6. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  7. 深入理解SQL注入绕过WAF与过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  8. SQL注入理解与防御

    一.说明 sql注入可能是很多学习渗透测试的人接触的第一类漏洞,这很正常因为sql注入可能是web最经典的漏洞.但在很多教程中有的只讲‘或and 1=1.and 1=2有的可能会进一步讲union s ...

  9. 什么是SQL注入?(理解)

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整s ...

随机推荐

  1. 【动态规划dp】青蛙的烦恼

    青蛙的烦恼(frog) 原文:https://blog.csdn.net/xyc1719/article/details/79844952 [题目描述] 池塘中有 n 片荷叶恰好围成了一个凸多边形,有 ...

  2. java-类、对象

    1.类和对象: 类是抽象的,通常不能直接使用 对象是具体的,根据类来创建对象. 2.如何定义一个类:成员变量.成员方法 成员变量:直接定义在类中,在方法外面 成员方法:去掉static 关键字,其他和 ...

  3. python报错记录

    1.AttributeError: 'NoneType' object has no attribute 'group' import re s=r'<title>kobe<\tit ...

  4. 立一个Flag吧

    以后在学习上遇到的问题以及解决办法,大部分都要记录在这里了,以备温故知新....就这样吧!

  5. Github上36893颗星!这个被称为下一代企业级应用首选技术你学了么?

    ​ 用一句话概括:这个技术,是JAVA后端框架的龙头老大,执牛耳者.这个技术就是: Spring Boot春靴. Spring Boot到底凭什么成为Java社区最具影响力的项目?说直白点,他爹Spr ...

  6. How to use draggable attribute?怎样使用拖拽属性代码分享

    6.7 Drag and dropSupport: dragndropChrome for Android NoneChrome 4+iOS Safari 11.0+UC Browser for An ...

  7. nvidia-smi 实时查看

    需要用到 watch 命令: watch -n nvidia-smi

  8. pycharm Python Console调试 & django 调试

    1.设置断点,然后debug     2.如果在运行中想修改变量,可以直接在pycharm中修改 如将列表的 13改成3,然后选中 Excuting Selection in console     ...

  9. 监听器----java

    监听器简介: 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletR ...

  10. Windows 2008 r2上安装MySQL

    用MSI安装包安装 根据自己的操作系统下载对应的32位或64位安装包.按如下步骤操作: MySQL数据库官网的下载地址http://dev.mysql.com/downloads/mysql,第一步: ...