SQL注入的四种防御方法总结

目录
  • 前言
  • 限制数据类型
  • 正则表达式匹配传入参数
  • 函数过滤转义
  • 预编译语句
  • 总结

前言

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

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

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

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

限制数据类型

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

正则表达式匹配传入参数

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

$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中谈到过,正则表达式匹配非常消耗性能,因此攻击时可以构造大量的正常语句‘骗’过服务器,当后台对数据的处理达到最大限制时就会放弃匹配后面我们构造的非法语句,从而略过这个数据包。

函数过滤转义

在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

预编译语句

预编译语句对现在的程序员来说基本都会去设计使用的方法,保障数据库的安全。一般来说,防御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注入,而实际上预编译也存在注入绕过的问题,并且也不是所有的地方都能够使用预编译语句。最佳的方式应该是多种方法结合,使用预编译的同时还要加上其他函数过滤,正则匹配等,更多的还有根据实际情况自定义函数确保安全。

总结

到此这篇关于SQL注入的四种防御方法总结的文章就介绍到这了,更多相关SQL注入防御方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 网络安全及防御之SQL注入原理介绍

    目录 A.SQL注入概述 什么是SQL注入 SQL注入的原理 SQL注入的地位 SQL注入的来源 SQL注入的主要特点 SQL注入的危害 B.SQL注入攻击 SQL注入攻击 SQL注入威胁表达方式 SQL注入典型攻击手段 SQL注入是否存在注入的判断方式 SQL注入实战步骤 按照注入点类型来分类 按照数据提交的方式来分类 按照执行效果来分类 C.MySQL注入常用函数 MySQL的注释风格 MySQL--union操作符 MySQL--常用函数 MySQL--字符串连接函数 MySQL--inf

  • 防御SQL注入的方法总结

    SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: Strin

  • 防御SQL注入攻击时需要注意的一个问题

    目前很多IIS防火墙其实质就是一个ISAPI Filter,针对SQL注入攻击的防御实质就是关键字过滤,这一点在我以前的随笔中提到的在开发的Web Server Guard中也是这样操作的.但目前大部分的IIS防火墙都存在一个漏洞:如果关键字包含未转义百分比符号 (%) ,那么将会绕过这些IIS防火墙的请求过滤和拦截,包含IIS 7.0的Request Filter. window.google_render_ad(); 因为这类防火墙都是查找位于URL/Form/Cookie中的关键字,比如E

  • SQL注入的四种防御方法总结

    目录 前言 限制数据类型 正则表达式匹配传入参数 函数过滤转义 预编译语句 总结 前言 最近了解到安全公司的面试中都问到了很多关于SQL注入的一些原理和注入类型的问题,甚至是SQL注入的防御方法.SQL注入真的算是web漏洞中的元老了,著名且危害性极大.下面这里就简单的分享一下我总结的四种SQL注入防御手段,加深理解,方便下次遇到这种问题时可以直接拿来使用.(主要是怕面试中脑壳打铁,这种情况太常见了) SQL注入占我们渗透学习中极大地一部分,拥有这很重要的地位.随着防御手段的不段深入,市面上存在

  • SQL注入详解及防范方法

    目录 一:什么是sql注入 二:SQL注入攻击的总体思路 三:SQL注入攻击实例 四:如何防御SQL注入 1.检查变量数据类型和格式 2.过滤特殊符号 3.绑定变量,使用预编译语句 五:什么是sql预编译 1.1:预编译语句是什么 1.2:MySQL的预编译功能 (1)建表 (2)编译 (3)执行 (4)释放 六:为什么PrepareStatement可以防止sql注入 (1):为什么Statement会被sql注入 (2)为什么Preparement可以防止SQL注入. 七:mybatis是如

  • 关于SQL注入中文件读写的方法总结

    前言 SQL注入有直接sql注入也有文件读写时的注入了我们这篇文章介绍的是SQL注入中的文件读写这一块的内容,具体的一起来看看. 一.MySQL 读文件 常见的读文件,可以用16进制代替字符串 select load_file('c:/boot.ini') select load_file(0x633a2f626f6f742e696e69) select load_file('//ecma.io/1.txt') # smb协议 select load_file('\\\\ecma.io\\1.t

  • Hibernate使用中防止SQL注入的几种方案

    Hibernate使用中防止SQL注入的几种方案 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 在获取便利操作的同时,SQL的注入问题也值得我们的密切注意,下面就来谈谈几点如何避免SQL注入:    1.对参数名称进行绑定: Query query=session.createQuery(hql); query.setString("name",name);     2.对参

  • Json日期格式问题的四种解决方法(超详细)

    开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示: //设置服务器响应的结果为纯文本格式 context.Response.ContentType = "text/plain"; //学生对象集合 List<Student> students = new List<Student> { new Student(){Name ="Tom&q

  • php解析xml 的四种简单方法(附实例)

    XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. 1. XML Expat Parser: XML Parser使用Expat XML解析器.Expat是一种基于事件的解析器,它把XML文档视为一系列事件.当某个事件发生时,它调用一个指定的函数处理它.Expat是无验证的解析器,忽略任何链接到文档的DTD.但是,如果文档的形式不好,则会以一个错误

  • sql语句实现四种九九乘法表

    下面用while 和 if 条件写的SQL语句的四种九九乘法表  sql语句实现--x 左下角九九乘法表 DECLARE @I INT ,@J INT,@S VARCHAR() SET @I= WHILE @I< BEGIN SET @J= SET @S='' WHILE @J<=@I BEGIN SET @S=@S+CAST(@J AS CHAR())+'*'+CAST(@I AS CHAR())+'='+CAST((@I*@J)AS CHAR()) SET @J=@J+ END PRINT

  • Java完全二叉树的创建与四种遍历方法分析

    本文实例讲述了Java完全二叉树的创建与四种遍历方法.分享给大家供大家参考,具体如下: 有如下的一颗完全二叉树: 先序遍历结果应该为:1  2  4  5  3  6  7 中序遍历结果应该为:4  2  5  1  6  3  7 后序遍历结果应该为:4  5  2  6  7  3  1 层序遍历结果应该为:1  2  3  4  5  6  7 二叉树的先序遍历.中序遍历.后序遍历其实都是一样的,都是执行递归操作. 我这记录一下层次遍历吧:层次遍历需要用到队列,先入队在出队,每次出队的元素

  • Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io import StringIO import numpy as np import pandas as pd ''' 下载网络文件,并导入CSV文件作为numpy的矩阵 ''' # 网络数据文件地址 url = "http://archive.ics.uci.edu/ml/machine-learning

  • vue移动端html5页面根据屏幕适配的四种解决方法

    最近做了两个关于h5页面对接公众号的项目,不得不提打开微信浏览器内置地图导航的功能确实有点恶心.下次想起来了的话,进行总结分享一下如何处理.在vue移动端h5页面当中,其中适配是经常会遇到的问题,这块主要有死个方法可以适用. 方法一:引入淘宝开源的可伸缩布局方案 引入淘宝开源的可伸缩布局方案:https://github.com/amfe/lib-flexible(此处可点击) 淘宝的其实也和viewport的有点像,但是它主要是根据设备设备像素比设置scale的值,保持视口device-wid

随机推荐