漏洞解决方案-SQL注入攻击
漏洞解决方案-SQL注入攻击
- 前置知识
- 修复方案
- 代码参考
前置知识
SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
威胁描述:
如果SQL注入成功,攻击者可以获取系统数据库的信息,可以修改删除数据库,还可能获取执行命令的权限,进而完全控制服务器。
涉及功能点:
任何涉及数据库连接的功能点,如用户登录、查询、数据修改、删除等功能。
修复方案
防范SQL注入,标准方案为输入验证与参数化查询相结合。
输入验证分为白名单和黑名单两种方式,通常在系统中是结合到一起来完成输入验证,具体实现通过正则表达式来完成。需要注意以下几方面:
- 在可信系统(比如:服务器)上执行所有的数据验证。
- 验证所有来自不可信数据源(比如:数据库,文件流,等)的数据。
- 应当为应用程序应提供一个集中的输入验证机制和规则。
- 为所有输入明确恰当的字符集,比如:UTF-8。在输入验证前,将数据按照常用字符进行编码(规范化)。如果进行关键字的验证,请先统一大小写。
- 验证的不仅是参数,包含所有来自客户端的数据,包括:所有参数、URL、HTTP头信息(比如:cookie名字和数据值)。
- 验证正确的数据类型、验证数据范围、验证数据长度。
- 请考虑是否允许输入常见危险字符。部分常见的危险字符包括:< > " ’ % ( ) & + \ ’ " 。
- 特殊字符单独验证:空字节 (%00);换行符 (%0d, %0a, \r, \n);路径替代字符“点-点-斜杠”(…/或…\)。验证替代字符:%c0%ae%c0%ae/ (使用规范化 验证双编码或其他类型的编码攻击)。
代码参考
安全开发实例:
使用特殊字符过滤程序防护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; //参数中不包含要过滤关键字; }
通过参数化查询方式进行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(); //返回查询结果
使用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注入攻击。
强类型的参数化查询,即在数据库增加、查询、更新操作时,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注入攻击相关推荐
- SQL注入攻击再度肆虐殃及大量网站
据研究人员称,上周一个自动SQL注入攻击劫掠了超过70,000个美国网站,并顺带攻击了访问这些网站的大量PC机用户.通过Google可以很容易搜索到受攻击的网站,网页内容千差万别,包括教育网和政府网域 ...
- SQL注入攻击及其防范检测技术研究
2008-12-18 来自:51CTO 作者:陈小兵 本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,并在此基础上给出了一种SQL注入攻击的自动防范模型. 1 SQL注入攻击概述 1 ...
- Web系统常见安全漏洞介绍及解决方案-sql注入
先看一下目录 一.常见漏洞类型 二.SQL注入 1.SQL 注入危险性.可能原因 2.场景重现 3.sql盲注 4.检测⽅法 5.防护⽅案 三.使用ORM框架 一.常见漏洞类型 关于web安全测试,目 ...
- ASP.NET 4学习笔记(1) SQL注入攻击及解决方案.
一, 定义:所谓SQL注入攻击是应用程序开发人员未预期地把SQL代码传入到应用程序的过程,只有那些直接使用用户提供的值构造SQL语句的应用程序才会受影响. 例如原SQL代码为: select Orde ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- 网站漏洞修复方案防止SQL注入攻击漏洞
SQL注入漏洞在网站漏洞里面属于高危漏洞,排列在前三,受影响范围较广,像asp..net.PHP.java.等程序语言编写的代码,都存在着sql注入漏洞,那么如何检测网站存在sql注入漏洞? SQL注 ...
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
SQL注入攻击 基础知识 常见注释符号 使用示例 pikachu 漏洞联系平台 -- SQL注入 SQL注入攻击流程 注入点类型 数字型注入(POST) 字符型注入(GET) 搜索型注入 XX型注入 ...
- sql注入漏洞,应屏蔽SQL注入攻击
2019独角兽企业重金招聘Python工程师标准>>> 注:SQL注入好比是前端URL传参数请求时参数以SQL 做为参数传入,如 select 1 from dual where ...
- mdcsoft服务器网络安全解决方案-SQL注入解决
{ 推荐大家,SQL注入最牛的解决办法在http://blog.mdcsoft.cn/archives/200805/46.html 太强大了,直接从IIS入口直接过滤掉了非法请求,mdcsoft-i ...
最新文章
- ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
- MySQL之定时备份及还原
- Directx11教程(15) D3D11管线(4)
- 用python画皮卡丘代码-利用Python绘制萌萌哒的皮卡丘
- 构建乘积数组(剑指offer)
- ABAP OO的八大理由
- c语言两字符串转数字后相加,一个觉得很难的C语言问题。对两个数字字符串相加。 C语言 如何把一个字符串中相连的两个数字转化为一......
- binaryformatter java_Java,C#使用二进制序列化、反序列化操作数据
- ubuntu系统下安装docker并部署Springboot+mysql+redis
- java比较时间戳大小_JAVA中两个String类型的时间戳怎么样比较大小?
- OpenHarmony3.0 编译烧录
- 【Hive】数据导入方法
- webpack配置babel-loader
- 【编程题目】寻找丑数
- java学习手册下载_java学习手册
- notepad++7.3.1中文版
- win10没有realtek高清晰音频管理器_Win10如何让电脑睡眠不断网?电脑睡眠状态不断网继续下载的方法...
- plot函数--R语言
- 【设计模式系列】--单例模式
- 现实迷途 第十三章 三兵一帅
热门文章
- QGC地面站中视频流配置及gstreamer安装
- Win11搜索栏无法使用怎么办?
- Python Level 4 程序题:输入两个整数,倒序输出
- 第一段代码 打开了新世界的大门
- mac下charles抓android7.0的包
- 最富人生哲理的24句电影台词
- Deprecated Gradle features were used in this build, making it incompatible with Gradle
- Proxy和Reflect详解
- PythonStock(10):使用notebook + tushare + pandas 简单的股票分析,蜡烛图
- 数据结构实验——实验二链表实验