跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

很多时候,我们并不需要屏蔽所有的HTML标签,或者,我们需要设置某些属性支持的HTML标签字符串。还好,框架中封装了相关的特性,以便你直接拿来使用。

命名空间:Magicodes.WeiChat.Infrastructure.MvcExtension.Filters

类名:AntiXssAttribute

Demo:

[AntiXss]
public string Name { get; set; } [AntiXss(allowedStrings: "<br />,<p>")]
public string Description { get; set; } [AntiXss(allowedStrings: "<br />", disallowedStrings:"/, #")]
public string NoSlashesOrHashes { get; set; } [AntiXss(errorMessage: "This is a custom error message")]
public string CustomError { get; set; } [AntiXss(errorMessageResourceName:"TestMessage", errorMessageResourceType: typeof(TestResources))]
public string ResourceCustomError { get; set; }

具体代码如下所示:

/// <summary>
/// AntiXss验证特性,防止XSS攻击
/// </summary>
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class AntiXssAttribute : ValidationAttribute
{
const string DefaultValidationMessageFormat = "字段 {0} XSS验证失败,请检查输入的字符串中是否含有非法字符。";
private readonly string errorMessage;
private readonly string errorMessageResourceName;
private readonly Type errorMessageResourceType;
private readonly string allowedStrings;
private readonly string disallowedStrings;
private readonly Dictionary<string, string> allowedStringsDictionary; /// <summary>
/// 初始化 <see cref="AntiXssAttribute"/> 的新实例.
/// </summary>
/// <param name="errorMessage">错误消息</param>
/// <param name="errorMessageResourceName">获取或设置错误消息资源的名称,在验证失败的情况下,要使用该名称来查找 ErrorMessageResourceType 属性值</param>
/// <param name="errorMessageResourceType">获取或设置在验证失败的情况下用于查找错误消息的资源类型。</param>
/// <param name="allowedStrings">以逗号分隔的允许的字符串。</param>
/// <param name="disallowedStrings">以逗号分隔的字符串不允许的字符或单词</param>
public AntiXssAttribute(
string errorMessage = null,
string errorMessageResourceName = null,
Type errorMessageResourceType = null,
string allowedStrings = null,
string disallowedStrings = null)
{
this.errorMessage = errorMessage;
this.errorMessageResourceName = errorMessageResourceName;
this.errorMessageResourceType = errorMessageResourceType;
this.allowedStrings = allowedStrings;
this.disallowedStrings = disallowedStrings;
allowedStringsDictionary = new Dictionary<string, string>();
}
/// <summary>
/// 确定对象的指定值是否有效。
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public override bool IsValid(object value)
{
return true;
}
/// <summary>
/// 确定对象的指定值是否有效。
/// </summary>
/// <param name="value"></param>
/// <param name="validationContext"></param>
/// <returns></returns>
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null)
{
return base.IsValid(null, validationContext);
} var encodedValue = EncoderHelper.HtmlEncode(value.ToString(), false); if (EncodedStringAndValueAreDifferent(value, encodedValue))
{
SetupAllowedStringsDictionary(); foreach (var allowedString in allowedStringsDictionary)
{
encodedValue = encodedValue.Replace(allowedString.Value, allowedString.Key);
} if (EncodedStringAndValueAreDifferent(value, encodedValue))
{
return new ValidationResult(SetErrorMessage(validationContext));
}
} if (!string.IsNullOrWhiteSpace(disallowedStrings)
&& disallowedStrings.Split(',').Select(x => x.Trim()).Any(x => value.ToString().Contains(x)))
{
return new ValidationResult(SetErrorMessage(validationContext));
} return base.IsValid(value, validationContext);
} private static bool EncodedStringAndValueAreDifferent(object value, string encodedValue)
{
return !value.ToString().Equals(encodedValue);
} private void SetupAllowedStringsDictionary()
{
if (string.IsNullOrWhiteSpace(allowedStrings))
{
return;
} foreach (var allowedString in allowedStrings.Split(',').Select(x => x.Trim())
.Where(allowedString => !allowedStringsDictionary.ContainsKey(allowedString)))
{
allowedStringsDictionary.Add(allowedString,
EncoderHelper.HtmlEncode(allowedString, false));
}
}
/// <summary>
/// 设置错误消息
/// </summary>
/// <param name="validationContext"></param>
/// <returns></returns>
private string SetErrorMessage(ValidationContext validationContext)
{
if (IsResourceErrorMessage())
{
var resourceManager = new ResourceManager(errorMessageResourceType);
return resourceManager.GetString(errorMessageResourceName, CultureInfo.CurrentCulture);
} if (!string.IsNullOrEmpty(errorMessage))
{
return errorMessage;
} return string.Format(DefaultValidationMessageFormat, validationContext.DisplayName);
} private bool IsResourceErrorMessage()
{
return !string.IsNullOrEmpty(errorMessageResourceName) && errorMessageResourceType != null;
}
}

Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击的更多相关文章

  1. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  2. 1、Web应用程序中的安全向量 -- XSS跨站脚本攻击

    XSS攻击(跨站脚本攻击)的概念: 用户通过网站页面的输入框植入自己的脚本代码,来获取额外的信息. XSS的实现方式: (1)通过用户将恶意的脚本命令输入到网站中,而这些网站又能够接收"不干 ...

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

    2012-11-20 09:03 (分类:网络安全) 这些规则适用于所有不同类别的XSS跨站脚本攻击,可以通过在服务端执行适当的解码来定位映射的XSS以及存储的XSS,由于XSS也存在很多特殊情况,因 ...

  4. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)

    转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...

  5. XSS(跨站脚本攻击)简单讲解

    1.1 XSS简介 跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞.这类漏洞能够使得攻击者嵌入恶意脚本代码(一般是JS代码)到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意 ...

  6. XSS 跨站脚本攻击之构造剖析(一)

    1.XSS-Filter:跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击 (1)XSS Filter实际上是一段精心编写的过滤函数作用是过滤XSS跨站脚本代码: (2)绕过XSS F ...

  7. XSS跨站脚本攻击实例讲解,新浪微博XSS漏洞过程分析

    2011年6月28日晚,新浪微博遭遇到XSS蠕虫攻击侵袭,在不到一个小时的时间,超过3万微博用户受到该XSS蠕虫的攻击.此事件给严重依赖社交网络的网友们敲响了警钟.在此之前,国内多家著名的SNS网站和 ...

  8. xss(跨站脚本攻击),crsf(跨站请求伪造),xssf

    我们常说的网络安全其实应该包括以下三方面的安全: 1.机密性,比如用户的隐私被窃取,帐号被盗,常见的方式是木马. 2.完整性,比如数据的完整,举个例子,康熙传位十四子,被当时四阿哥篡改遗诏:传位于四子 ...

  9. PHP漏洞全解(四)-xss跨站脚本攻击

    本文主要介绍针对PHP网站的xss跨站脚本攻击.跨站脚本攻击是通过在网页中加入恶意代码,当访问者浏览网页时恶意代码会被执行或者通过给管理员发信息 的方式诱使管理员浏览,从而获得管理员权限,控制整个网站 ...

随机推荐

  1. Linux:安装图形界面

    能连接网络的前提下,使用yum安装 yum groupinstall  -y "Desktop"yum groupinstall   -y "X Window Syste ...

  2. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entities()) { var classes = db.Classes.Wh ...

  3. vsnprintf

    http://www.cplusplus.com/reference/cstdio/vsnprintf/ int vsnprintf (char * s, size_t n, const char * ...

  4. input输入子系统

    一.什么是input输入子系统? 1.Linux系统支持的输入设备繁多,例如键盘.鼠标.触摸屏.手柄或者是一些输入设备像体感输入等等,Linux系统是如何管理如此之多的不同类型.不同原理.不同的输入信 ...

  5. S5PV210的LCD控制器详解

    1.FIMD结构框图 (1)Samsung的s5pv210的LCD控制器叫做FIMD(也叫显示控制器).Display controller(显示控制器)包括用于将图像数据从相机接口控制器的本 地总线 ...

  6. Jqurey DOM 操作详解

    一.获取 1.获取内容----.text()  .html()   .value() text() - 设置或返回所选元素的文本内容                         格式:$(选择器) ...

  7. css属性word-spacing和letter-spacing的区别

    word-spacing和letter-spacing用来定义单词或者字母之间的水平空白间隔.顾名思义,word-spacing定义了单词之间的空白,例如: <div style="w ...

  8. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  9. java多线程学习-开篇

    1.Java线程基本概念 在操作系统中两个比较容易混淆的概念是进程(process)和线程(thread).操作系统中的进程是资源的组织单位.进程有一个包含了程序内容和数据的地址空间,以及其它的资源, ...

  10. ssh框架整合---- spring 4.0 + struts 2.3.16 + maven ss整合超简单实例

    一 . 需求 学了这么久的ssh,一直都是别人整合好的框架去写代码,自己实际动手时才发现框架配置真是很坑爹,一不小心就踏错,真是纸上得来终觉浅! 本文将记录整合struts + spring的过程 , ...