目标:编写SQL动态查询,防止SQL注入

  通常所说的“SQL动态查询”是指将程序中的变量和基本SQL语句拼接成一个完整的查询语句。

反模式:将未经验证的输入作为代码执行

  当向SQL查询的字符串中插入别的内容,而这些被插入的内容以你不希望的方式修改了查询语法时,SQL注入就成功了。

  传统的SQL注入案例中,所插入的内容首先完成了一个查询,然后再执行第二个完整的查询逻辑比如:@bugId的值是

1234;Delete from Bugs,最后的SQL语句变成如下格式:

Select * from Bugs where bugId = 1234;Delete from Bugs

  1、意外无处不在

由于字符串引起的语法错误,SQL语句是不会被执行的。

      风险较大的是产生的SQL没有任何语法错误,并且以一种你所不希望的方式执行。

  2、对Web安全的严重威胁

    当攻击者能够使用SQL注入操控你的SQL查询语句时,就变成了一个巨大的威胁。

通常做法是在参数后插入额外的字符串,改变对应SQL语句的意义,例如:

Update Account

set password = SHA2('zyxzy'

where accountId = 123 or true  --在传入accountId参数等于123的后面,添加了 or true

理解SQL注入的关键,也是如何防止SQL注入的关键:SQL注入是通过在SQL语句被数据库解析之前,

          以修改其语法的形式工作的。只要在解析语句之前插入动态部分,就存在SQL注入的风险。

  3、寻找解决方法

    (1)转义:对传入的参数字符串进行转义操作,使它们不至于成为字符串的结束符。

使用2个连续的单引号或者反斜杠来转义。实现原理是在将应用程序中的数据插入到SQL语句之前

就进行转换。这种技术能减少由于动态内容中不匹配是引号做造成的SQL注入的风险,但在非字符串

内容的情况下,这种技术就会失效。

    (2)查询参数:查询参数的做法是在准备查询语句的时候,在对应参数的地方使用“参数占位符”。随后,

在执行这个预先准备好的查询时提供一个参数。

该方法的确是应对SQL注入的强劲解决方案,但是这还不是一个通用的解决方案,因为查询参数总是被视为是一个字面值。

      (a)多个值的列表不可以当成单一参数;

      (b)表名无法作为参数;

(c)列名无法作为参数;

(d)SQL关键字无法作为参数;

    (3)存储过程:存储过程是包含固定的SQL语句,这些语句在定义这个存储过程的时候被解析的。

在存储过程也可以使用SQL动态查询的,这样也存在安全隐患。

    (4)数据访问框架ORM:对于所有允许你使用字符串方式传入SQL语句的框架来说,都无法抵御SQL注入的攻击。

如何识别反模式:几乎所有的数据库应用程序都动态地构建SQL语句,如果使用拼接字符串的形式或者将变量插入到字符串的

  方法来构建SQL语句,这样的sql语句就会受到SQL注入攻击的威胁。

合理使用反模式:没有任何理由使用反模式

解决方案

  1、过滤输入内容,将所有不合法的字符从用户输入中剔除掉。

  2、参数化动态内容:如果查询中的变化部分是一些简单的类型,应该使用查询参数将其和SQL表达式分离。

如果是在RDBMS解析完SQL语句之后才插入这个参数值,没有哪种SQL注入的功能能改变一个参数化了查询的语法结构。

即使攻击者尝试使用带有恶意的参数值,诸如123 or true ,关系型数据库管理系统也会将这个字符串当成一个完整的值插入

Update Account

set password = SHA2('zyxzy'

where accountId ='123 or true' --当做一个完整的字符串而不会造成威胁

  3、给动态输入的值加引号

参数查询通常来说是最好的解决方案,但是在有些特殊的情况下,参数的占位符会导致查询优化器无法选择使用

哪个索引来进行优化查询。

  4、找个可靠的人来帮你审查SQL语句

在检查代码是否包含SQL注入风险的时候,参考一下几点:

    (1)找出所有使用了程序变量、字符串链接或者替换等方法组成的SQL语句。

    (2)跟踪在SQL语句中使用的动态内容的来源。找出所有的外部输入,比如用户输入、文件、系统环境、网络服务、

第三方代码,甚至于从数据库中获取的字符串。

(3)假设任何外部内容都是潜在的威胁,对于不受信任的内容都要进行过滤、验证或者使用数组映射的方式来处理。

    (4)在将外部数据合并到SQL语句时,使用查询参数,或者用稳健的转义函数预先处理。

    (5)在存储过程的代码以及任何其他使用SQL动态查询语句的地方都做同样的检查。

结论:让用户输入内容,但永远别让用户输入代码

SQL反模式,系列学习汇总

1SQL反模式学习笔记1 开篇

2、SQL反模式学习笔记2 乱穿马路

3、SQL反模式学习笔记3 单纯的树

4、SQL反模式学习笔记4 建立主键规范【需要ID】

5、SQL反模式学习笔记5 外键约束【不用钥匙的入口】

6、SQL反模式学习笔记6 支持可变属性【实体-属性-值】

7、SQL反模式学习笔记7 多态关联

8、SQL反模式学习笔记8 多列属性

9、SQL反模式学习笔记9 元数据分裂

10、SQL反模式学习笔记10 取整错误

11、SQL反模式学习笔记11 限定列的有效值

12、SQL反模式学习笔记12 存储图片或其他多媒体大文件

13、SQL反模式学习笔记13 使用索引

14、SQL反模式学习笔记14 关于Null值的使用

15、SQL反模式学习笔记15 分组

16、SQL反模式学习笔记16 使用随机数排序

17、SQL反模式学习笔记17 全文搜索

18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

19、SQL反模式学习笔记19 使用*号,隐式的列

20、SQL反模式学习笔记20 明文密码

21、SQL反模式学习笔记21 SQL注入

22、SQL反模式学习笔记22 伪键洁癖,整理数据

SQL反模式学习笔记21 SQL注入的更多相关文章

  1. SQL反模式学习笔记1 开篇

    什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...

  2. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  3. SQL反模式学习笔记3 单纯的树

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

  4. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  5. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  6. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

  7. SQL反模式学习笔记7 多态关联

    目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...

  8. SQL反模式学习笔记8 多列属性

    目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...

  9. SQL反模式学习笔记9 元数据分裂

    目标:支持可扩展性.优化数据库的结构来提升查询的性能以及支持表的平滑扩展. 反模式:克隆表与克隆列 1.将一张很长的表拆分成多张较小的表,使用表中某一个特定的数据字段来给这些拆分出来的表命名. 2.将 ...

随机推荐

  1. C++ 动态链接库 DLL 的一些笔记

    DLL 文件源代码: // test.h #ifdef TEST_EXPORTS #define TEST_API __declspec(dllexport) #endif class TEST_AP ...

  2. Hdoj 2149.Public Sale 题解

    Problem Description 虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金.现在等待他的,就是像FarmJohn一样的农田生涯. 要种田得有田才行,Le ...

  3. Pack

    背包专题 背包吼哇! 基础的背包分为OI01背包,完全背包,多重背包,二维背包,分组背包,树形背包,求方案数等.......... 作为DP的一个基础部分还是有必要写一写的. 01背包: 一个物品能取 ...

  4. mybatis 模糊查询 like的三种方式

    第一种 public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%" ...

  5. 腾讯云服务器tomcat端口无法访问

    第一种情况: 如题:https://console.cloud.tencent.com/cvm/securitygroup 需要去这个地址设置安全组. 说实话,一句mmp不知当讲不当讲.使用说明这块太 ...

  6. Exponent CMS 2.3.9 配置文件写入 Getshell分析

    在 install/index.php 的第44行 expString::sanitize($_REQUEST); 跟进sanitize函数 public static function saniti ...

  7. MySQL学习笔记(一)Ubuntu16.04中MySQL安装配置(5.6优化、错误日志、DNS解决)

    目录 第一部分.5.6安装.配置.自动备份 第二部分.5.7源码安装.配置.自动备份 第一部分.5.6安装 1.安装mysql sudo apt-get install mysql-server su ...

  8. Flask Web中文教程

    Flask Web中文教程:http://docs.jinkan.org/docs/flask/

  9. SpringBoot(七):SpringBoot整合Swagger2

    原文地址:https://blog.csdn.net/saytime/article/details/74937664 手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文 ...

  10. vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失

    vue父路由默认选中第一个子路由,切换子路由让父路由高亮不会消失 正常默认会有 .router-active-class 识别高亮 达到以上注意: 1. exact 不要加 注意是不要加,exact ...