漏洞解决方案-SQL注入攻击

  • 前置知识
  • 修复方案
  • 代码参考

前置知识

SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。


威胁描述:
如果SQL注入成功,攻击者可以获取系统数据库的信息,可以修改删除数据库,还可能获取执行命令的权限,进而完全控制服务器。
涉及功能点:
任何涉及数据库连接的功能点,如用户登录、查询、数据修改、删除等功能。

修复方案

防范SQL注入,标准方案为输入验证与参数化查询相结合。
输入验证分为白名单和黑名单两种方式,通常在系统中是结合到一起来完成输入验证,具体实现通过正则表达式来完成。需要注意以下几方面:

  • 在可信系统(比如:服务器)上执行所有的数据验证。
  • 验证所有来自不可信数据源(比如:数据库,文件流,等)的数据。
  • 应当为应用程序应提供一个集中的输入验证机制和规则。
  • 为所有输入明确恰当的字符集,比如:UTF-8。在输入验证前,将数据按照常用字符进行编码(规范化)。如果进行关键字的验证,请先统一大小写。
  • 验证的不仅是参数,包含所有来自客户端的数据,包括:所有参数、URL、HTTP头信息(比如:cookie名字和数据值)。
  • 验证正确的数据类型、验证数据范围、验证数据长度。
  • 请考虑是否允许输入常见危险字符。部分常见的危险字符包括:< > " ’ % ( ) & + \ ’ " 。
  • 特殊字符单独验证:空字节 (%00);换行符 (%0d, %0a, \r, \n);路径替代字符“点-点-斜杠”(…/或…\)。验证替代字符:%c0%ae%c0%ae/ (使用规范化 验证双编码或其他类型的编码攻击)。

代码参考

安全开发实例:

  1. 使用特殊字符过滤程序防护SQL注入攻击:
    代码功能:对HTTP请求中的所有参数进行危险字符过滤,发现危险字符可跳转到相应的错误页面。

    public void doFilter(ServletRequest args0, ServletResponse args1,FilterChain chain) throws IOException, ServletException {HttpServletRequest req=(HttpServletRequest)args0;HttpServletResponse res=(HttpServletResponse)args1;//获得所有请求参数名Enumeration params = req.getParameterNames();String sql = "";while (params.hasMoreElements()) {//得到参数名String name = params.nextElement().toString();//得到参数对应值String[] value = req.getParameterValues(name);for (int i = 0; i < value.length; i++) {sql = sql + value[i];}}//有sql注入和XSS危险字符if (sqlValidate(sql)) {throw new IOException("您发送请求中的参数中含有非法字符:"+sql);//此处可根据系统实际情况进行统一的错误处理,可跳转到error.html} else {chain.doFilter(args0,args1);}
    }protected static boolean sqlValidate(String str) {str = str.toLowerCase();  //统一转为小写String badStr = "and|exec|insert|select|delete|update|count|union|master|truncate|char|declare|cast|set|fetch|varchar|sysobjects|drop|`|'|\"|<|>|(|)|/|\|=|+|-|#|*|;|%";  //过滤掉的sql注入和XSS的关键字,可以手动添加和修改String[] badStrs = badStr.split("\\|");for (int i = 0; i < badStrs.length; i++) {if (str.indexOf(badStrs[i]) >= 0) {return true;  //参数中包含要过滤关键字;}}return false;  //参数中不包含要过滤关键字;
    }
    
  2. 通过参数化查询方式进行SQL注入攻击防护:

    String sql = “select * from product where cat=’?’ and price >’?’”;  //创建包含参数占位符的SQL语句
    PreparedStatement pstmt = con.prepareStatement(sql);   //创建PreparedStatement对象
    pstmt.setInt(1, request.getParameter(“cat”));   //设置参数一类型和取值
    pstmt.setString(2, request.getParameter(“price”));  //设置参数二类型和取值
    ResultSet rs = pstmt.executeQuery();   //返回查询结果
    
  3. 使用MyBatis技术,通过Mapper.xml文件定义SQL语句进行SQL注入攻击防护:

    <mapper namespace="TestUser">    //命名空间
    <select id="getById" parameterType="java.lang.String"resultMap="TestFlowResult">select<include refid="TestFlowColumns" /><![CDATA[from TEST_TABLEwhereINSPECT_ID = #{id} ]]>
    </select>
    </mapper>
    

    在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

  4. 强类型的参数化查询,即在数据库增加、查询、更新操作时,sql语句中所有输入参数统一采用#param#方式。示例如下:

    <update id="updatePtaskDetailState" parameterClass="java.lang.String">update ZX_PTASKDETAIL set BATCHJNLNOSTATE = '4' where JNLNO = #jnlNo#
    </update>
    

    需要使用like语句的地方可以使用’%’||#param#||’%‘或concat(concat(’%’,#param#),’%’)避免注入。示例如下

    select * from ZX_PCIF where name like '%'||#name#||'%'
    

关注公众号,一起分享实用安全技术,关注安全最新事件,记录工作常见问题,吐槽生活真心操蛋。

漏洞解决方案-SQL注入攻击相关推荐

  1. SQL注入攻击再度肆虐殃及大量网站

    据研究人员称,上周一个自动SQL注入攻击劫掠了超过70,000个美国网站,并顺带攻击了访问这些网站的大量PC机用户.通过Google可以很容易搜索到受攻击的网站,网页内容千差万别,包括教育网和政府网域 ...

  2. SQL注入攻击及其防范检测技术研究

    2008-12-18  来自:51CTO  作者:陈小兵 本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,并在此基础上给出了一种SQL注入攻击的自动防范模型. 1  SQL注入攻击概述 1 ...

  3. Web系统常见安全漏洞介绍及解决方案-sql注入

    先看一下目录 一.常见漏洞类型 二.SQL注入 1.SQL 注入危险性.可能原因 2.场景重现 3.sql盲注 4.检测⽅法 5.防护⽅案 三.使用ORM框架 一.常见漏洞类型 关于web安全测试,目 ...

  4. ASP.NET 4学习笔记(1) SQL注入攻击及解决方案.

    一, 定义:所谓SQL注入攻击是应用程序开发人员未预期地把SQL代码传入到应用程序的过程,只有那些直接使用用户提供的值构造SQL语句的应用程序才会受影响. 例如原SQL代码为: select Orde ...

  5. WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案

    对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...

  6. 网站漏洞修复方案防止SQL注入攻击漏洞

    SQL注入漏洞在网站漏洞里面属于高危漏洞,排列在前三,受影响范围较广,像asp..net.PHP.java.等程序语言编写的代码,都存在着sql注入漏洞,那么如何检测网站存在sql注入漏洞? SQL注 ...

  7. 基于pikachu漏洞平台的 --SQL注入攻击学习与总结

    SQL注入攻击 基础知识 常见注释符号 使用示例 pikachu 漏洞联系平台 -- SQL注入 SQL注入攻击流程 注入点类型 数字型注入(POST) 字符型注入(GET) 搜索型注入 XX型注入 ...

  8. sql注入漏洞,应屏蔽SQL注入攻击

    2019独角兽企业重金招聘Python工程师标准>>> 注:SQL注入好比是前端URL传参数请求时参数以SQL 做为参数传入,如 select 1  from dual where ...

  9. mdcsoft服务器网络安全解决方案-SQL注入解决

    { 推荐大家,SQL注入最牛的解决办法在http://blog.mdcsoft.cn/archives/200805/46.html 太强大了,直接从IIS入口直接过滤掉了非法请求,mdcsoft-i ...

最新文章

  1. ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
  2. MySQL之定时备份及还原
  3. Directx11教程(15) D3D11管线(4)
  4. 用python画皮卡丘代码-利用Python绘制萌萌哒的皮卡丘
  5. 构建乘积数组(剑指offer)
  6. ABAP OO的八大理由
  7. c语言两字符串转数字后相加,一个觉得很难的C语言问题。对两个数字字符串相加。 C语言 如何把一个字符串中相连的两个数字转化为一......
  8. binaryformatter java_Java,C#使用二进制序列化、反序列化操作数据
  9. ubuntu系统下安装docker并部署Springboot+mysql+redis
  10. java比较时间戳大小_JAVA中两个String类型的时间戳怎么样比较大小?
  11. OpenHarmony3.0 编译烧录
  12. 【Hive】数据导入方法
  13. webpack配置babel-loader
  14. 【编程题目】寻找丑数
  15. java学习手册下载_java学习手册
  16. notepad++7.3.1中文版
  17. win10没有realtek高清晰音频管理器_Win10如何让电脑睡眠不断网?电脑睡眠状态不断网继续下载的方法...
  18. plot函数--R语言
  19. 【设计模式系列】--单例模式
  20. 现实迷途 第十三章 三兵一帅

热门文章

  1. QGC地面站中视频流配置及gstreamer安装
  2. Win11搜索栏无法使用怎么办?
  3. Python Level 4 程序题:输入两个整数,倒序输出
  4. 第一段代码 打开了新世界的大门
  5. mac下charles抓android7.0的包
  6. 最富人生哲理的24句电影台词
  7. Deprecated Gradle features were used in this build, making it incompatible with Gradle
  8. Proxy和Reflect详解
  9. PythonStock(10):使用notebook + tushare + pandas 简单的股票分析,蜡烛图
  10. 数据结构实验——实验二链表实验