最近了解到安全公司的面试中都问到了很多关于SQL注入的一些原理和注入类型的问题,甚至是SQL注入的防御方法。SQL注入真的算是web漏洞中的元老了,著名且危害性极大。下面这里就简单的分享一下我总结的四种SQL注入防御手段,加深理解,方便下次遇到这种问题时可以直接拿来使用。(主要是怕面试中脑壳打铁,这种情况太常见了)

SQL注入占我们渗透学习中极大地一部分,拥有这很重要的地位。随着防御手段的不段深入,市面上存在SQL注入的网站的确少之又少了,但不能说是没有。在我看来,学习SQL注入的目的并不只是学习针对这种方法,而是一类方法,包括他的思想,思路和奇淫技巧,简单点说就是举一反三学到现在发现好像越向后面学其他漏洞,方法思路都大体一致,比如字符串拼接,构造闭合语句,函数替代等等。

好了,说了这么多,现在我们步入正题吧!

我们简单理解SQL注入就是在人为可以构造参数的地方加入一些非法敏感语句,绕过后端的处理,并带入到数据库中执行,然后返回敏感数据的过程。

  1. 限制数据类型

    在传入参数的地方限制参数的类型,比如整型 Integer,随后加入函数判断,如is_numeric($_GET[‘id’]) 只有当get到的id为数字或者数字字符时才能执行下一步,限制了字字符自然就限制了注入,毕竟构造参数怎么可能不传入字符。但这种方法存在一定的限制,只能在特定的页面才能使用,一般大部分都是要求我们传入的字符串,但可以很大程度限制整型注入的情况。(针对此函数也是有一定绕过手段,比如转为十六进制)

  2. 正则表达式匹配传入参数

    相信对于正则表达式大家都不陌生了,几乎在过滤比较严格的地方都有正则表达式。(后面我也会写一篇关于使用正则表达式的文章,包括基础的使用和绕过)。这里简单解读一下这段正则表达式:

    $id=$_POST['id'];
    if (preg_match('/and|select|insert|insert|update|[A-Za-z]|/d+:/i', $id)) { die('stop hacking!'); } else {echo 'good'; }
    
    preg_match() 函数匹配传入的id值,
    / 作为正则的起始标识符
    | 代表或
    [A-Za-z] 表示匹配参数中是否存在大小写的26个字符
    /d 匹配是否存在数字
    +匹配一次或多次
    /i 不区分大小写
    

    像下面这句:
    ?id=1’ union select 1,2# 因为匹配到union select,输出 stop hacking!
    正则表达式也具有一定危险性,在SQL注入绕过waf中谈到过,正则表达式匹配非常消耗性能,因此攻击时可以构造大量的正常语句‘骗’过服务器,当后台对数据的处理达到最大限制时就会放弃匹配后面我们构造的非法语句,从而略过这个数据包。

  3. 函数过滤转义

    在php中最基本的就是自带的magic_quotes_gpc函数,用于处理 ’ " 符号加上/ 防止转义, 比如:

     ?id=1' and 1=1#  ===> ?id=1/' and 1=1#
    

    另外还有addslashes(),也具有相同的效果。

    像前面提到的**preg_match()**函数结合正则表达式或者黑名单也具有预防效果。

    小tips:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

    • mysql_escape_string($string):用反斜杠转义字符串中的特殊字符,用于mysql_query()查询。
    • mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
      转义的符号包括 \x00 \n \r \ ’ " \x1a
  4. 预编译语句

    预编译语句对现在的程序员来说基本都会去设计使用的方法,保障数据库的安全。一般来说,防御SQL注入的最佳方式就是使用预编译语句,绑定变量

    String query="select password from users where username='?' ";
    

    下面讲一下什么叫预编译:使用预编译相当于是将数据于代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变SQL的结构,在这个例子中,即使攻击者插入类似 admin’ or 1=1# 的字符串,如果不做处理直接带入查询,那么query则变成了

    query="select password from users where username='admin' or 1=1 ";
    

    闭合了后面的引号,从而执行了恶意代码。而预编译则是将传入的 admin’ or 1=1# 当做纯字符串的形式作为username执行,避免了上面说到的SQL语句中的拼接闭合查询语句等过程,可以理解为字符串与sql语句的关系区分开,username此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。就相当于拿着这个字符串去数据库中找有没有这个东西一样。并且使用预编译的SQL语句,SQL语句的语义不会发生改变。

    下面给个php绑定变量的事例:

    $query="INSERT INTO myCity (Name,CountryCode,District) VALUES (?,?,?)";
    $stmt=$mysqli->prepare($query);
    $stmt->bind_param("sss",$val1,$val2,$val3);
    $val1="Stuttgart";
    $val2="DEU";
    $val3="Baden";
    //execute the statement
    $stmt->execute();
    

    以上谈到的四种方法都是一些基本方法,具体怎么实现防御还要看怎么去设计。说到预编译语句是最佳方式,并不是说只是使用这一种方法就能够防止SQL注入,而实际上预编译也存在注入绕过的问题,并且也不是所有的地方都能够使用预编译语句。最佳的方式应该是多种方法结合,使用预编译的同时还要加上其他函数过滤,正则匹配等,更多的还有根据实际情况自定义函数确保安全。

最近在看《白帽子将web安全》这本书,这篇文章很多都是用的里面的知识。书里讲的很好很详细,有深度也有广度。在学习中也有很多疑惑的地方,初入网络安全,希望可以和大家多多交流彼此经验。同时也欢迎各个大佬指正!

浅谈SQL注入的四种防御方法相关推荐

  1. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:"老师你这SQL有注 ...

  2. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  3. 浅谈SQL注入,XSS攻击

    作为计算机小白,一直都认为黑客很牛逼所以简单的了解一下这反面的知识--信息安全 黑客是个英译词,译作Hacker.黑客攻击或者黑计算机的方式多种多样,主要分为两种: (1)非破坏性的攻击:一般是为了扰 ...

  4. 浅谈SQL注入漏洞原理及利用方式

    1.SQL注入 原理: 在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判断,导致其传入的恶意"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行.漏洞产生于脚 ...

  5. 强网杯 2019]随便注 【SQL注入】四种解法

    题目简介 题目名称:[强网杯 2019]随便注 1 题目平台:BUUCTF 题目类型:Web 考察知识点: SQL注入 解题步骤 方法一: 首先启动并访问靶机,有一个输入框,随便输入1' or 1 = ...

  6. java四种内部类区别_浅谈Java中的四种内部类

    如果你看过一些JDK和框架源码的话,就经常会发现一般在类的定义中,都会再定义一些其他的类,这些类也同样会被编译成字节码文件,这样的类就被叫做 内部类 ,按照一般的分法,大致可以分为以下四类: 成员内部 ...

  7. 浅谈整数拆分的四种方法

    DP 对于拆分为 < = n <=\sqrt n <=n ​部分,直接背包,对于 > n >\sqrt n >n ​的部分由于最多只有 n \sqrt n n ​个 ...

  8. 事物日志恢复 mysql_浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用...

    本篇文章是系列文章中的第五篇,是对前一个日志系列的补充篇.如果您对日志的基本概念还没有一个比较系统的了解,可以参看本系列之前的文章: 浅谈SQL Server中的事务日志(一)----事务日志的物理和 ...

  9. sql注释符注入防御_WAF的SQL注入绕过手段和防御技术

    一.关于SQL注入 SQL注入是一种常见的入侵WEB应用的手法.SQL注入是利用应用系统的编程漏洞和SQL语言的语法特征,改变原始的SQL语句执行逻辑而产生的. 攻击者向Web应用发送精心构造的输入数 ...

  10. mysql groupby having_浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多 ...

最新文章

  1. EJB3.0定时发送jms(发布/定阅)方式
  2. oracle 触发器 upsert,数据库管理员
  3. 服务器组装 华硕主板,专业组装服务器 华硕主板P9D-C/4L热销
  4. ROS探索总结(四)——简单的机器人仿真
  5. 使用Elastic APM监控你的.NET Core应用
  6. jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解
  7. 对于scanf,strcpy等函数报4996错误的粗暴而简单解决办法
  8. 原创 Spark go nsx很可爱的 公众号 vSAN 文章合集
  9. c语言如何扩大字体,C语言图形汉字及放大显示程序
  10. iOS 初识CoreBluetooth
  11. 主流H.264编码器对比测试 (MSU出品)
  12. [Python设计模式] 第25章 联合国维护世界和平——中介者模式
  13. html div 画半圆,css画变形的半圆
  14. 电力系统自动化远程监控方案
  15. js在一个指定元素前添加内容_Day036-JS
  16. Github-谷歌插件gitzip(加速器-不用再忍受几十kb/s的煎熬了)
  17. 发光细胞:小鼠活体成像工具细胞原理于应用实例
  18. java 限制录入特殊字符_要求输入框里面必须同时含有字母,数字,特殊字符,且不小于8位...
  19. 小米总监说软件测试分为这及类
  20. 【SSLGZ 1614】医院设置(Dijkstra)

热门文章

  1. 网络机顶盒固件增删预装APP步骤
  2. fgui的ui管理框架_FGUI,UGUI在ET框架上的使用以及区别
  3. 汽车服务架构(SOA)开发设计
  4. 安卓签名MD5相关说明
  5. java控制zebra打印机_从Zebra打印机读取状态
  6. 【官方文档】Fluent Bit 安装
  7. APP推广的八大“邪恶”方法?做好产品才是王道!
  8. java 同音字_pinyin: The high performance pinyin tool for java.(java 高性能中文转拼音工具。支持同音字。)...
  9. 新媒体活动策划方案要点
  10. Linux驱动开发(硬件基础)——处理器