注入攻击(SQL注入防御)
正确的防御SQL注入
sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全。
例如 mysql_real_escape_string()函数会对输入的参数进行转义。
$sql="SELECT id,name,mail,cv,blog,twitter FROM register WHERE id= ".mysql_real_escape_string($_GET['id']);
当攻击者构造的注入代码如下时:
http://vuln.example.com/user.php?id=2,and,1=1,union,select,1,
concat(user,0x3a,password),3,4,5,6,from,mysql.user,where,
user=substring_index(current_user(),char(64),1)
将会绕过这个函数注入成功,其原因在于这个函数仅仅会转义: ' " \r \n NULL Control-Z
这种基于黑名单的方法,或多或少地存在些问题,是不可能排除所有恶意符号或者说能利用的符号。
围绕着SQL注入攻击产生的两个关键条件:1.用户控住的输入参数 2.拼接过程中的数据当做代码执行。
有下面几个防御措施:
一.使用预编译语句
一般来说,防御SQL注入的最好效果就是使用预编译语句,绑定变量。例如在Java中使用预编译的SQL语句:
String userName=request.getParameter("userName");
String query="SELECT account_balance FROM user_data WHERE
user_name=?";
PreparedStatement pstmt=connection.prepareStatament(query);
pstmt.setString(1,userName);
ResultSet results=pstmt.executeQuery();
使用这种预编译的SQL语句,SQL语句的语义不会发生改变,变量用?表示,攻击者无法改变SQL的结构。
在PHP中绑定变量的示例:
$query="INSERT INTO myCity(Name,CountCode,District)VALUES(?,?,?)";
$stmt=$mysqli->prepare($query);
$stmt->bind_param("sss",$var1,$var2,$var3);
$var1="StuName";
$var2="DEU";
$var3="Bid";
$stmt->execute();
在不同的语言中,都有着预编译语句的方法:
Java EE------ PreparedStatement()
.NET------SqlCommand() or OleDbCommand()
PHP------bind_Param()
Hibernate------createQuery()
SQLite------sqlite3_prepare()
二.使用存储函数
使用安全的存储过程对抗SQL注入。使用存储过程与预编译语句的区别在于,存储过程要先将SQL语句定义在数据库中,所以存储过程也可能存在注入问题,得尽量避免在存储过程中使用动态的SQL语句。如果业务要求,实在无法避免,则可以考虑加上严格的输入过滤或者是编码函数来处理用户的输入数据。
Java中存储过程的示例,其中sp_getAccount是预先在数据中定义好的存储过程。
String username=request.getParameter("userName");
try{
CallableStatement cs=
connection.prepareCall(" {call sp_getAccount(?)} ");
cs.setString(1,username);
ResultSet results=cs.executeQuery();
}catch(SQLException se){
//....some error info and error handing
}
三.检查数据类型
检出数据类型,在很大程度上能够对抗SQL注入。
比如下面这段代码,就限制了输入数据只能为integer。
<?php settype($offset,'integer');
$query="SELECT id ,name FROM produces ORDER BY name LIMIT
20 OFFSET ;"; $query=sprintf("SELECT id ,name,FROM produces ORDER BY name LIMIT 20 OFFSET %d;");
?>
其他数据格式或者类型检查也是有益的,但是提交字符串,则需要依赖其他的方法防御SQL注入,而不能使用'%s"代换"%d"。
四.使用安全函数
安全函数,数据库厂商都往往对此都做出了“指导”。可以参考OWASP ESAPI中的实现。这个函数由安全专家编写的,更值得信赖。
ESAPI.encoder().encoderForSQL(new OracleCodec(),queryparam);
使用示例:
Codec ORACLE_CODEC=new OracleCode();
String query="SELECT user_id FROM user_data WHERE user_name=' "+
ESAPI.encoder().encoderForSQL( ORACLE_CODEC,req.getParameter("userID"))+" ' and
user_password=' "+
ESAPI.encoder().encoderForSQL( ORACLE_CODEC,req.getParameter("pwd"))+" ' ";
注入攻击(SQL注入防御)的更多相关文章
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- 注入攻击(SQL注入)
注入攻击是web安全领域中一种最为常见的攻击方式.注入攻击的本质,就是把用户输入的数据当做代码执行.这里有两个关键条件,第一是用户能够控制输入,第二个就是原本程序要执行的代码,将用户输入的数据进行了拼 ...
- XSS攻击&SQL注入攻击&CSRF攻击?
- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 ...
- XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式
SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...
- False注入,以及SQL注入技巧总结
title: False注入,以及SQL注入技巧总结 date: 2017-04-25 00:23:31 tags: ['SQL注入'] --- 利用False我们可以绕过一些特定的WAF以及一些未来 ...
- 防止sql注入式攻击 SQL注入学习——三层架构
解决方案是:1.首先在UI录入时,要控制数据的类型和长度.防止SQL注入式攻击,系统提供检测注入式攻击的函数,一旦检测出注入式攻击,该数据即不能提交:2.业务逻辑层控制,通过在方法内部将SQL关键字用 ...
- xss 攻击 sql 注入
XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...
- 最新SQL手工注入语句&SQL注入大全
看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...
随机推荐
- NLP入门(四)命名实体识别(NER)
本文将会简单介绍自然语言处理(NLP)中的命名实体识别(NER). 命名实体识别(Named Entity Recognition,简称NER)是信息提取.问答系统.句法分析.机器翻译等应用领 ...
- Git Extensions 和 Tortoisegit 到底是什么?Git For VS(Git For Visual Studio)(Visual Studio 中使用 Git)
前言: 我们使用 Git 作为版本控制的朋友们,一定都熟悉 Git Extensions 和 Tortoisegit 两款工具,但是对于初学者,可能就不那么了解了. 当然如果有幸,你接触过 SVN , ...
- EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误
报错信息:LINQ to Entities does not recognize the method 'System.String ToString()' method, and this meth ...
- Android Studio 使用Toast
Toast 是Android系统中体重的一种非常好的提醒方式 在程序中可以将很小的一段消息提醒给用户 在一段时间后自动消失,不会占用如何屏幕空间 Button button1=(Button) fin ...
- Linux-read 命令(20)
Linux read 命令 参数说明: -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符. -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志. -p ...
- 持续集成 自动化构建、测试、部署您的Coding代码
持续集成(Continuous Integration)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量. 它的核心措施是,代码集成到主干之前, ...
- 判断文本是否溢出/hover显示全部
前言 在工作中我们经常会遇到,文字过多,需要用省略号,并且鼠标hover的时候 还需要 显示全部的文字的需求. 正文 文字过多需要用省略号的实现:上代码啦 .ellipsis { width: 100 ...
- cf55D. Beautiful numbers(数位dp)
题意 题目链接 Sol 看到这种题就不难想到是数位dp了. 一个很显然的性质是一个数若能整除所有位数上的数,则一定能整除他们的lcm. 根据这个条件我们不难看出我们只需要记录每个数对所有数的lcm(也 ...
- Dynamics 365工作流报错:您无法登陆系统。原因可能是您的用户记录或您所属的业务部门在Microsoft Dynamics 365中已被禁用。
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复265或者20170926可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- Windows 不能在本地计算机启动 OracleDBConsoleorcl的问题解决方法
解决步骤如下: 1.开始->运行cmd 2.执行 emctl start dbconsole 输入:C:\Documents and Settings\xcl>emctl start db ...