Web安全相关(一):跨站脚本攻击(XSS)
简介
一些场景
1. 恶意攻击者可以在个人介绍里面插入恶意代码,那么其他用户访问他的个人信息时,就会执行恶意代码。
2. 恶意攻击者可以发表一篇文章,取一个吸引眼球的标题,在内容里插入恶意代码,那么用户查看这篇文章时,就会执行恶意代码。
3. 恶意攻击者在一些热门文章或帖子里的回复或留言中插入恶意代码,那么用户浏览到他的回复或留言时,就会执行恶意代码。
防止XSS的两个阶段
1. 提交数据时,就对数据进行验证,如果含有恶意脚本,则不让数据进库,ASP.NET MVC默认是会做这个验证。如下图,如果试图插入恶意脚本,就会得到一个HttpRequestValidationException。注:图2红色框中的方法后续会提到。

图1

图2
如果我们需要允许脚本入库,可以在对应的Action上加上[ValidateInput(false)]。此时恶意脚本还不能产生威胁,因为还有后面一个阶段的防止措施。

图3

图4
2. 输出数据时,对输出的内容采用HTML编码,恶意脚本不会被执行。而且,MVC的Razor语法默认就采用HTML编码。但是如果我们采用Html.Raw()来输出内容的话,恶意脚本就会产生威胁。

图5

图6
一些恶意脚本
$.ajax数据验证失效?
我们假设我们的需求是不允许含有恶意脚本的数据进库的,但是我们使用了jquey的ajax进行交互。

图7

图8

图9

图10
数据还是进库,为什么呢?我们来研究下图2红框中的方法。

图11

图12
从图12中,我猜测MVC会对Request中的以上内容进行验证,可是jquery ajax的数据是存在Request的Content里面的,因此,默认的验证对jquery ajax并没有效果。
$.ajax数据验证实现
要对$.ajax进行数据验证,我从ModelBinder下手。具体代码如下:
public class AjaxModelBinder : DefaultModelBinder
{
protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, object value)
{
var contentType = controllerContext.HttpContext.Request.ContentType; if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase) &&
value is string &&
controllerContext.Controller.ValidateRequest &&
bindingContext.PropertyMetadata[propertyDescriptor.Name].RequestValidationEnabled)
{
if (IsDangerousString(value.ToString()))
{
throw new HttpRequestValidationException("在请求中检测到有潜在危险的值!");
}
} return base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);
} /// <summary>
/// Refer the method "System.Web.CrossSiteScriptingValidation.IsDangerousString".
/// </summary>
private static bool IsDangerousString(string str)
{
var startingChars = new[] { '<', '&' };
var startIndex = ; while (true)
{
var index = str.IndexOfAny(startingChars, startIndex); if (index < )
{
return false;
} if (index == (str.Length - ))
{
return false;
} var ch = str[index]; if (ch != '&')
{
if ((ch == '<') && ((IsAtoZ(str[index + ]) || (str[index + ] == '!')) || ((str[index + ] == '/') || (str[index + ] == '?'))))
{
return true;
}
} else if (str[index + ] == '#')
{
return true;
} startIndex = index + ;
}
} private static bool IsAtoZ(char c)
{
return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
}
}
然后在Global.asax.cs中注册AjaxModelBinder。

图13
那么,输入数据有恶意脚本时就会被检测出来。

图14
关于AjaxModelBinder中的IsDangerousString方法,我是从.Net的源码拷贝过来的。

图15
另外,如果需要对js显示内容进行编码,可以使用Ajax.JavaScriptStringEncode()方法。
AntiXSS第三方组件
如果使用.Net4.0及以上的版本,那么就不需要引入AntiXSS,因为.Net 4.0已经把AntiXSS集成进来了。如果是其他版本则需要引入。
XSS扫描检测工具
我之前的公司有专门的测试团队,他们用工具可以对程序进行扫描找出有风险的页面,并给出建议。现在想了解下这方面的工具,如果有对这方面了解的朋友,欢迎给我推荐工具。
源码下载
为了方便使用,我没有使用任何数据库,而是用了一个文件来存储数据。代码下载后可以直接运行,无需配置。
下载地址:https://github.com/ErikXu/XSS

Web安全相关(一):跨站脚本攻击(XSS)的更多相关文章
- 跨站脚本攻击XSS(二)——session劫持
转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小 ...
- 记录一次网站漏洞修复过程(三):第二轮处理(拦截SQL注入、跨站脚本攻击XSS)
在程序编写的时候采用参数化的SQL语句可以有效的防止SQL注入,但是当程序一旦成型,再去修改大量的数据库执行语句并不是太现实,对网页表单上输入进行校验是易于实现的方法.在webForm 页面中开启校验 ...
- [Web安全之实战] 跨站脚本攻击XSS
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1. 认识XSS 2. ...
- Web安全之跨站脚本攻击(XSS)
XSS 简介 跨站脚本攻击,英文全称是 Cross Site Script,本来缩写是CSS,但是为了和层叠样式表(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做&q ...
- 跨站脚本攻击XSS
跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到 ...
- java防范跨站脚本攻击(XSS)
网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加fi ...
- 渗透之路基础 -- 跨站脚本攻击XSS
目录 漏洞原理及防御 XSS 原理分析:输出问题导致js代码被识别执行 XSS 技术分类 Cookie盗取 基于Xss的WebShell箱子的攻击 XSS相关防护过滤及绕过分析(参考链接) 防护: 绕 ...
- 跨站脚本攻击xss学习
0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: ...
- 网站安全系列:跨站脚本攻击XSS
本篇博文主要从概念和应用上介绍XSS,主要内容来源于<白帽子讲web安全> XSS核心本质 XSS实际上是一种HTML注入,用户输入的数据被当成HTML的一部分来执行.防御方法核心是输入检 ...
- 网络安全-跨站脚本攻击XSS(Cross-Site Scripting)
一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者 ...
随机推荐
- SQLServer执行命令出现“目录无效的提示”
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...
- Spring之旅(2)
Spring简化Java的下一个理念:基于切面的声明式编程 3.应用切面 依赖注入的目的是让相互协作的组件保持松散耦合:而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件. AOP面向切面 ...
- PHP之GD函数的使用
本文讲解常用GD函数的应用 1.一个简单的图像 我们先看一个例子: <?php $w = 200; $h = 200; $img = imagecreatetruecolor($w,$h); $ ...
- css样式之border-radius
border-radius 属性设置边框的园角 可能的值:像素,百分比 扩展延伸 html代码 <div></div> css代码 div { height: 200px; w ...
- 中国CIO最关心的八大问题(下)
中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...
- Android程序中--不能改变的事情
有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...
- Atitit 管理原理与实践attilax总结
Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...
- sqlserver批量修改首字母为大写
'hello world' ----> 'Hello world' update tableName set columnName=CHAR(ASCII(SUBSTRING(columnN ...
- hibernate-mapping-3.0.dtd;hibernate-configuration-3.0.dtd;hibernate.properties所在路径
hibernate-mapping-3.0.dtd 所在路径:hibernate-release-5.2.5.Final\project\hibernate-core\src\main\resourc ...
- 【腾讯Bugly干货分享】移动客户端中高效使用SQLite
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b57f2a0703f7d31b9a3932 作者:赵丰 导语 iOS 程序能 ...