1. 什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过递交参数构造巧妙的SQL语句,从而成功获取想要的数据。

2. SQL注入的种类

从具体而言,SQL注入可分为五大类,分别是:数字型注入、字符型注入、搜索型注入(like)、in型的注入、句语连接型注入。

从应用来说,要特别注意IP、搜索、批量删除、从数据库转到数据库等地方的SQL注入。

3. 如何防止SQL注入

3.1 SQL注入产生的原因

看下面检查登陆的SQL语句:

SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '"

+ UserName + "' AND UserPassword = '" + PassWord + "'", conn);

由于没有对UserName和PassWord进行任何验证,如果UserName=”admin’OR 1=1--“

所执行的SQL语句就成了:

SELECT * FROM PE_USERS WHERE UserName=’admin’ OR 1=1—‘ AND UserPassword=’’

这就造成了SQL注入,条件永远为真,也就不用密码也能登陆成功。

3.2主要防御方式

防御手段一:参数化查询

保护级别:★★★★★

描述:

使用参数化查询的好处:可以防止sql注入式攻击,提高程序执行效率。

例如:

const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName";

Parameters parms = new Parameters("@UserName", DbType.String, userName);

中有一个参数@UserName,使用Prarmeter对象,通过它把参数添加到Command对象上,这样就获得参数化查询。

如上述语句,ADO.NET会向SQL Server发送下面的SQL语句:

Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N ‘@username nvarchar(20) ‘,@username=N ‘name’

SQL Server把@username替换成字符串”name”,然后再执行查询.

假设有下面的输入:

‘union select @@version,null,null—

生成的SQL语句如下所示:

Exec sp_executesql N ‘select * from [pe_users] where username=@username ‘,N ‘@username nvarchar(20) ‘,@username=N ‘’’ union select @@version,null,null--’

可以看到ADO.NET转义了输入。

public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);

DbTye或SqlDbType可以是多种数据类型。

可根据你的数据类型来选择。

在某些地方,也可似指定参数的长度:int size。这样也能有效防止数据库溢出和SQL注入的可能性。

优点:有效地防止了SQL注入的产生。

缺点:有些地方不能应用,如in。

防御手段二:过滤与转换

保护级别:★★★★

描述:

对于数据型要强制转换成数字Clng,对于字符型,要通过函数过滤。如:

private string SafeSqlLiteral(string inputSQL)

{

return inputSQL.Replace("'", "''");

}

对于搜索的地方LIKE子句,要注意,如果要使用LIKE子句,还必须对通配符字符进行转义:

s = s.Replace("[", "[[]");

s = s.Replace("%", "[%]");

s = s.Replace("_", "[_]");

对于in类型,要转换成规格的数字串或字符串。

要尽量少用语句连接形式写SQL语句,要用到的地方要确保连接语句的安全性,或在白名单内,或限制很短的长度,以防止SQL语句构造的危险。

优点:有效地防止了SQL注入,实现简单。

缺点:容易遗漏,对于某些地方还是不能过滤,如order by +变量

对于不能使用参数化查询的部份,我们使用过滤函数处理,过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如:FilterBadChar函数。这函数主要用于业务逻辑层的过滤,对于数据库,我们还使用了强制转换函数,在命名空间PowerEasy.SqlServerDal下的DBHelper类,如:ToValidId函数等,主要用于数据库无出错的处理操作

防御手段三:白名单

保护级别:★★★★

描述:

对于一些已知的参数范围,可用白名单的形式处理,能有交防止SQL注入和查询出错,如:order by +列名,列名以参数形式传入时,可制定一个白名单,先判断一下参数是否在白名单内,再进行查询,否则出错处理。

优点:安全可靠

缺点:应用范围小

3.3辅助防御方式

防御手段一:严格过滤

保护级别:★★★☆

描述:

对于不能参数化查询或者无法限制变量类型和范围的情况,使用过滤的手段来处理。对于数据库中读取的数量要进入查询语句,在不确定数据是否安全的情况下,要对其进入过滤。这种SQL注入比较隐蔽,所以要特别注意。

优点:能用于不能参数化而又难过滤的地方,如order by +变量

缺点:过滤过于严格。

应用举例:

对于不能使用参数化查询的部份,我们使用过滤函数处理,过滤函数在命名空间PowerEasy.Framework.Common中的DataSecurity类下,如:FilterBadChar函数。

防御手段二:限定URL传递参数的数据类型和范围

保护级别:★★★

描述:

限定URL的传递参数类型、数量、范围等来防止通过构造URL进行恶意攻击。参见MSDN杂志

优点:在一定的程序上有效地防止通过URL方式的注入。

缺点:容易遗忘正常需要的参数。

防御手段三:全局过滤SQL关键字过滤

保护级别:★★★

描述:

在某些地方进行全局过滤SQL关键字过滤,如对标签的解释。(可能存在过滤不完全和限制程序开发的问题)

优点:能用于不能参数化而又难过滤的地方,如table的连接。

缺点:过滤过于严格。

更多关于SQL注入,可参考这篇文章:

http://www.microsoft.com/taiwan/msdn/columns/huang_jhong_cheng/LVSS.htm

四、 跨站脚本攻击

1. 什么是跨站脚本攻击

跨站脚本攻击(通常简写为XSS)是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。

2. 跨站脚本攻击的危害

入侵者便通过技术手段在某个页面里插入一个恶意HTML代码,例如记录论坛保存的用户信息(Cookie),由于Cookie保存了完整的用户名和密码资料,用户就会遭受安全损失。如这句简单的Java脚本就能轻易获取用户信息:alert(document.cookie),它会弹出一个包含用户信息的消息框。入侵者运用脚本就能把用户信息发送到他们自己的记录页面中,稍做分析便获取了用户的敏感信息。

跨站脚本攻击的危险,在如今WEB安全越来越得到重视,他的危险性也越来越大。有效防止跨站脚本攻击,是WEB程序是否安全的一个重要标准。

3. 如何防止跨站脚本攻击

3.1 主要防御方式

防御手段一:编码输出

保护级别:★★★★★

描述:

对于不支持HTML代码的地方,可用编码输出。如:Server.UrlEncode等方法编码输出。

优点:安全可靠。

缺点:不支持HTML代码。

防御手段二:使用UBB编码

保护级别:★★★★

描述:

UBB代码是HTML的一个变种,是Ultimate Bulletin Board (国外的一个BBS程序)采用的一种特殊的TAG。它能有效的限制HTML代码的使用,增强系统输出的安全性。

优点是:简单,容易实现,利用白名单形式,易于控制。

缺点是:只支持小量特定html代码,编辑器功能小。

3.2 辅助防御方式

防御手段一: iframe security="restricted"

保护级别:★★★★

描述:

通过设置iframe security="restricted",能有效防止iframe类的攻击(对IE有效).

优点:有效防止iframe的攻击。

防御手段二: HttpOnly

保护级别:★★★★

描述:

设置Cookie的HttpOnly属性,有效地防止Cookie通过脚本泄密(IE6 SP1以上、Firefox 3)。

优点:有效保护了用户Cookie信息。

应用举例:

所有登陆验证的地方,验证成功后设置authCookie.HttpOnly = true,设置Cookie的HttpOnly属性,这些都应用于用户登陆成功的地方。

防御手段三:字符过滤

保护级别:★★★★

描述:

通过函数进行过滤,能有效防止常见脚站脚本的跨站攻击。主要过滤常见恶意脚本代码,如:

<applet|meta|xml|blink|link|style|script|embed|object|iframe|frame|frameset|ilayer|layer|bgsound|title|base>

OnX事件代码、Javascript、Vbscript和Style中的expression、behaviour、script、position等。

但过滤可能存在不完全的情况。建立自己的XSS攻击库,方便测试和收集新的攻击方式,使过滤函数更加完善。

优点:支持HTML,有效防止大部份攻击代码。

缺点:可能存在过滤不全的情况。

应用举例:

目前而言,主要采用函数RemoveXss进行处理,由于RemoveXss并非十分完善,有待更好的过滤方案。但函数能防止目前主流的XSS攻击。所以在支持HTML代码的输出,一定要通过这个函数进行过滤(也可以输入到数据库前过滤)。

SQL注入与xss的更多相关文章

  1. yii框架各种防止sql注入,xss攻击,csrf攻击

    PHP中常用到的方法有: /*  防sql注入,xss攻击  (1)*/    function actionClean($str)    {        $str=trim($str);      ...

  2. 防止sql注入。xss攻击 方法

    //防止sql注入.xss攻击    /**     * 过滤参数     * @param string $str 接受的参数     * @return string     */    publ ...

  3. 防止SQL注入和XSS攻击Filter

    nbsp;今天系统使用IBM的安全漏洞扫描工具扫描出一堆漏洞,下面的filter主要是解决防止SQL注入和XSS攻击 一个是Filter负责将请求的request包装一下. 一个是request包装器 ...

  4. PHP防止SQL注入和XSS攻击

    PHP防止SQL注入和XSS攻击PHP防范SQL注入是一个非常重要的安全手段.一个优秀的PHP程序员除了要能顺利的编写代码,还需要具备使程序处于安全环境下的能力.说到网站安全,就不得不提到SQL注入( ...

  5. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  6. StringEscapeUtils的常用使用,防止SQL注入及XSS注入

    StringEscapeUtils的常用使用,防止SQL注入及XSS注入 2017年10月20日 11:29:44 小狮王 阅读数:8974   版权声明:本文为博主原创文章,转载请注明出处. htt ...

  7. SQL 注入、XSS 攻击、CSRF 攻击

    SQL 注入.XSS 攻击.CSRF 攻击 SQL 注入 什么是 SQL 注入 SQL 注入,顾名思义就是通过注入 SQL 命令来进行攻击,更确切地说攻击者把 SQL 命令插入到 web 表单或请求参 ...

  8. Nginx 防止SQL注入、XSS攻击的实践配置方法

    下班的时候,发现博客访问缓慢,甚至出现504错误,通过 top -i 命令查看服务器负载发现负载数值飙升到3.2之多了,并且持续时间越来越频繁直至持续升高的趋势,还以为是被攻击了,对来访IP进行了阈值 ...

  9. WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

    核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Websh ...

  10. 分享一个php的防火墙,拦截SQL注入和xss

    一个基于php的防火墙程序,拦截sql注入和xss攻击等 安装 composer require xielei/waf 使用说明 $waf = new \Xielei\Waf\Waf(); $waf- ...

随机推荐

  1. java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)

    最近开始学习java并发容器,以补充自己在并发方面的知识,从源码上进行.如有不正确之处,还请各位大神批评指正. 前言: 本人个人理解,看一个类的源码要先从构造器入手,然后再看方法.下面看Bounded ...

  2. kafka安装和使用

    kafka安装和启动 kafka的背景知识已经讲了很多了,让我们现在开始实践吧,假设你现在没有Kafka和ZooKeeper环境. Step 1: 下载代码 下载0.10.0.0版本并且解压它. &g ...

  3. mongodb 上限集合

    上限集合是固定大小的循环集合按照插入以支持高性能的创建,读取和删除操作.通过循环,这意味着,当分配给该集合中的固定大小要用尽时,它会开始删除集合中最旧的文件而不提供任何明确的命令. 上限集合限制更新, ...

  4. vue2.0:(四)、首页入门,组件拆分1

    为什么需要组件拆分呢?这样才能更符合模块化这样一个理念. 首先是index.html,代码如下: <!DOCTYPE html> <html> <head> < ...

  5. 常用验证函数isset()/empty()/is_numeric()函数

    1) isset()用来检查变量是否设置,若变量存在且值不为NULL时为TRUE: 检查多个变量时变量要全部存在且值不为NULL时为TRUE: 若用函数unset()释放后再用isset()检测时为F ...

  6. Android镜像文件ramdisk.img,system.img,userdata.img介绍

    Android 源码编译后,在out目录下生成的三个镜像文件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data. ramdis ...

  7. 用YII实现多重查询(基于tag)

    场景: 有一个饭店表 restaurant,存放所有饭店记录.我需要一个功能,将饭店按照不同的条件进行多重查询.就象这样:   氛围:浪漫 / 商务会谈 / 茅草屋 菜系:川菜 / 鲁菜 / 家常菜. ...

  8. 霍金的新语音系统 ACAT 将开源

    英国理论物理学家斯蒂芬·霍金(Stephen Hawking)使用了二十年的语音通讯系统被英特尔开发的新一代通讯平台替代,显著改进了通讯效率.但霍金的声音并没有发生改变,他仍然使用相同的语音合成器.霍 ...

  9. java 中设计模式

    1. 单例模式(一个类只有一个实例) package ch.test.notes.designmodel; /** * Description: 单例模式 (饿汉模式 线程安全的) * * @auth ...

  10. python基础一 day13 复习

    # 函数 —— 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),* ...