XSS攻击全称跨站脚本攻击(Cross Site Scripting),是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码(如HTML代码和客户端脚本)植入到提供给其它用户使用的页面中。要预防XSS攻击,就必须在处理客户端请求之前判断用户的输入是否合法,如果不合法就要拦截。在ASP.NET项目的根目录下有一个全局程序文件Global.asax文件,每次IIS请求都会按顺序执行这个文件中的不同事件。其中Application_BeginRequest事件在ASP.NET开始处理每个请求时触发,在这个事件处理中的代码将在页面或者服务处理请求之前执行。我们可以在这里写代码去验证客户端请求是否合法。

  首先在app_code文件夹下创建一个XSSFilter类,这是ASP.NET创建网站时默认存储类的文件夹

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text.RegularExpressions; /// <summary>
///XSSFilter 的摘要说明
/// </summary>
public class XSSFilter
{
public XSSFilter() { } private const string StrRegex = @"<[^>]+?style=[\w]+?:expression\(|\b(alert|confirm|prompt)\b|^\+/v(8|9)|<[^>]*?=[^>]*?&#[^>]*?>|\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|/\*.+?\*/|<\s*script\b|<\s*img\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
public static bool PostData()
{
bool result = false;
try
{
for (int i = ; i < HttpContext.Current.Request.Form.Count; i++)
{
result = CheckData(HttpContext.Current.Request.Form[i].ToString());
if (result)
{
break;
}
}
}
catch (HttpRequestValidationException ex)
{
return true;
}
return result;
} public static bool GetData()
{
bool result = false;
try
{
for (int i = ; i < HttpContext.Current.Request.QueryString.Count; i++)
{
result = CheckData(HttpContext.Current.Request.QueryString[i].ToString());
if (result)
{
break;
}
}
}
catch (HttpRequestValidationException ex)
{
return true;
}
return result;
} public static bool CookieData()
{
bool result = false;
try
{
for (int i = ; i < HttpContext.Current.Request.Cookies.Count; i++)
{
result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower());
if (result)
{
break;
}
}
}
catch (HttpRequestValidationException ex)
{
return true;
}
return result; } public static bool referer()
{
bool result = false;
return result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString());
} public static bool CheckData(string inputData)
{
if (Regex.IsMatch(inputData, StrRegex))
{
return true;
}
else
{
return false;
}
}
}

然后在Global.asax的Application_BeginRequest事件中添加如下代码:

     void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Cookies != null)
{
if (XSSFilter.CookieData())
{
Response.Write("您提交的Cookie数据有恶意字符!");
Response.End();
}
}
if (Request.UrlReferrer != null)
{
if (XSSFilter.referer())
{
Response.Write("您提交的Referrer数据有恶意字符!");
Response.End();
}
}
if (Request.RequestType.ToUpper() == "POST")
{
if (XSSFilter.PostData())
{
Response.Write("您提交的Post数据有恶意字符!");
Response.End();
}
}
if (Request.RequestType.ToUpper() == "GET")
{
if (XSSFilter.GetData())
{
Response.Write("您提交的Get数据有恶意字符!");
Response.End();
}
}
}

测试一下,在提交表单时或者手动修改URL输入一行脚本<script>alert('test');</script>,就会跳转到错误提示页面。
如果用的是异步ajax提交,在回调函数中判断一下就可以了。

最新文章

  1. 分享一个php邮件库——swiftmailer
  2. C2第八次解题报告
  3. 替罪羊树模板(BZOJ1056/1862)
  4. VCL -- Understanding the Message-Handling System
  5. Checking Network Configuration requirements Failed
  6. cocos2dx游戏开发学习笔记3-lua面向对象分析
  7. hdu4521 小明系列的问题——小明序列(LIS变种 (段树+单点更新解决方案))
  8. python 解析nginx 日志 url
  9. apply/call/bind的区别与用法
  10. 前端小白第一次使用redux存取数据练习
  11. update layer tree导致页面卡顿
  12. CentOS 7安装Ansible
  13. JOptionPane
  14. url组成
  15. history命令追查登录的用户和时间
  16. Linux中 /boot 目录介绍 【转载】
  17. 代码记录——phase16,block36
  18. Android 浅谈 设计与屏幕适配 【1.6235449734285716】
  19. cocos sdkbox android 接入注意
  20. javac符号名字的管理

热门文章

  1. C++常见的概念
  2. matlab数学实验--第二章
  3. 《从Lucene到Elasticsearch:全文检索实战》学习笔记五
  4. Windows10下搭建Android Studio3.12开发环境
  5. JS 点击复制
  6. SSB基准测试
  7. 织梦Dedecms文件目录结构
  8. ubuntu16.04 安装最新版nodejs
  9. 前端-JavaScript1-2——JavaScript建立认知
  10. google的protobuf简单介绍