每一个开发者都会意识到,网站发布之前,需要进行安全检查。

那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(XSS)、SQL注入攻击等恶意攻击行为?

针对目前常见的一些安全问题,结合目前一些常见的防护办法,通用权限管理系统底层增加了安全防护代码,

现将源码提供如下

namespace DotNet.Utilities
{
/// <summary>
/// 网站安全通用防护
///
/// 主要功能:
/// 拦截攻击者注入恶意代码,可以防御诸如跨站脚本攻击(XSS)、SQL注入攻击等恶意攻击行为。
///
/// 修改纪录
///
/// 2013-12-27,更新正则表达式避免误报问题。
/// 2013-01-08,更新了aspx防护脚本中referer变量冲突问题。
/// 2013-01-09,加入了UTF7编码XSS的防护。
/// 2013-01-28,增强了对XSS的防护。
/// 2013-01-31,针对某些用户后台上传文件出错的问题。
/// 2013-03-15,增强了对POST的防护。
/// 2013-03-28,增强了对XSS的防护。
/// 2013-04-25,对XSS防护加入了通用的防护方法。
/// 2013-08-02,加入对XSS编码绕过的防护。
/// 2013-08-14,增强利用样式的XSS防护。
/// 2014-11-12,解决SQL盲注不拦截的问题。
///
/// 2014-11-12 版本:1.0 SongBiao 创建文件。
///
/// <author>
/// <name>SongBiao</name>
/// <date>2014-11-12</date>
/// </author>
/// </summary>
public partial class SecretUtil
{
//正则过滤字符
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)";
/// <summary>
/// POST请求
/// </summary>
/// <param name="putData">输出非法字符串</param>
/// <returns></returns>
public static bool PostData(out string putData)
{
bool result = false;
putData = string.Empty;
for (int i = ; i < HttpContext.Current.Request.Form.Count; i++)
{
result = CheckData(HttpContext.Current.Request.Form[i].ToString(), out putData);
if (result)
{
putData = HttpContext.Current.Request.Form[i].ToString();
break;
}
}
return result;
}
/// <summary>
/// GET请求
/// </summary>
/// <param name="putData">输出非法字符串</param>
/// <returns></returns>
public static bool GetData(out string putData)
{
bool result = false;
putData = string.Empty;
for (int i = ; i < HttpContext.Current.Request.QueryString.Count; i++)
{
result = CheckData(HttpContext.Current.Request.QueryString[i].ToString(), out putData);
if (result)
{
putData = HttpContext.Current.Request.QueryString[i].ToString();
break;
}
}
return result;
} /// <summary>
/// COOKIE
/// </summary>
/// <param name="putData">输出非法字符串</param>
/// <returns></returns>
public static bool CookieData(out string putData)
{
bool result = false;
putData = string.Empty;
for (int i = ; i < HttpContext.Current.Request.Cookies.Count; i++)
{
result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower(), out putData);
if (result)
{
putData = HttpContext.Current.Request.Cookies[i].Value.ToLower();
break;
}
}
return result; }
/// <summary>
/// UrlReferrer请求来源
/// </summary>
/// <param name="putData">输出非法字符串</param>
/// <returns></returns>
public static bool Referer(out string putData)
{
bool result = false;
result = CheckData(HttpContext.Current.Request.UrlReferrer.ToString(), out putData);
if (result)
{
putData = HttpContext.Current.Request.UrlReferrer.ToString();
}
return result;
}
/// <summary>
/// 正则检查
/// </summary>
/// <param name="inputData">字符串</param>
/// <param name="putData">输出非法字符串</param>
/// <returns></returns>
public static bool CheckData(string inputData, out string putData)
{
putData = string.Empty;
//if (Regex.IsMatch(inputData.ToUpper(), StrRegex.ToUpper(),RegexOptions.IgnoreCase))
if (Regex.IsMatch(inputData, StrRegex, RegexOptions.IgnoreCase))
{
putData = inputData;
return true;
}
else
{
return false;
}
}
} }

源码在通用权限底层中的位置:

调用方法:(ASP.NET MVC参考)在Global.asax文件中增加以下方法

        /// <summary>
/// 在此处进行安全检测和防范
/// Application_BeginRequest
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
string putData = string.Empty;
if (Request.Cookies != null)
{
if (SecretUtil.CookieData(out putData))
{
ResponseWarnMessage(context, "Cookie数据有恶意字符!", putData);
}
}
if (Request.UrlReferrer != null)
{
if (SecretUtil.Referer(out putData))
{
ResponseWarnMessage(context, "Referrer数据有恶意字符!", putData);
}
}
if (Request.RequestType.ToUpper() == "POST")
{
if (SecretUtil.PostData(out putData))
{
ResponseWarnMessage(context, "Post数据有恶意字符!", putData);
}
}
if (Request.RequestType.ToUpper() == "GET")
{
if (SecretUtil.GetData(out putData))
{
ResponseWarnMessage(context, "Get数据有恶意字符!", putData);
}
}
}
/// <summary>
/// 非安全行为 输出警告信息
/// </summary>
/// <param name="errorMessage"></param>
/// <param name="putData"></param>
private void ResponseWarnMessage(HttpContext context, string errorMessage, string putData)
{
//记录一下恶意攻击行为
string ipAddress = Utilities.GetIPAddress(true);
BaseUserInfo userInfo = context.Session[DotNet.Business.Utilities.SessionName] as BaseUserInfo;
//非安全行为同时记录到数据库和文本文件中
LogHelper.OracleWarn(userInfo, "恶意访问行为", "来自IP:" + ipAddress + "的访问存在恶意行为:" + errorMessage + "字符内容:" + putData, " private void ResponseErrorMessage(string errorMessage, string putData)", typeof(MvcApplication), null);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "General");
routeData.Values.Add("title", "非法访问与请求提醒");
routeData.Values.Add("error", "你提交的" + errorMessage + "字符内容:" + putData);
IController errorController = new ErrorController();
errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
context.Response.End();
}

上面的处理方法可根据需要自己调整,我是将攻击信息使用系统的日志功能记录到Oracle数据库中,并在页面显示攻击信息,

测试:在地址后加入"?action=delete from user"

以上安全代码也可单独放到你的程序中使用,建议尚未做安全防护的朋友尽快加上,避免受到一些常见的攻击行为骚扰。

网站安全通用防护代码(C#版本源码提供)的更多相关文章

  1. spring各个版本源码

    各版本源码下载地址 http://maven.springframework.org/release/org/springframework/spring/

  2. Spring各版本源码下载

    spring framework 各版本源码下载地址 现在spring的源码下载地址真是不好找,这次终于找到了.记录一下,以帮助需要的朋友. https://github.com/spring-pro ...

  3. [转帖]nginx1.17.2版本源码安装

    nginx1.17.2版本源码安装 原创: 沧海书生 Ansible爱好者 昨天 公众号里面的内容 这里简单测试了下 在x86的虚拟机里面编译安装 nginx 仅make make install n ...

  4. Kafka 0.10.1版本源码 Idea编译

    Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...

  5. Goldeneye.py网站压力测试工具2.1版源码

    Goldeneye压力测试工具的源代码,粗略看了下,代码写的蛮规范和易读的,打算边读边加上了中文注释,但是想来也没太大必要,代码600多行,值得学习的地方还是蛮多的,喜欢Python的同学可以一读 这 ...

  6. 《k8s-1.13版本源码分析》- Informer 机制

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  7. 《k8s-1.13版本源码分析》-调度优选

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  8. jquery的2.0.3版本源码系列(6):2880-3042行,回调对象,对函数的统一管理

    目录 1 . 回调对象callbacks的演示 回调的使用有一点像事件绑定,先绑定好,等到有点击事件或者其他时就触发. <script src="js/jquery-2.0.3.js& ...

  9. jquery的2.0.3版本源码系列(4):285-348行,extend方法详解

    目录 1 . jquery extend的基本使用 通过285行的源码 jQuery.extend = jQuery.fn.extend = function() { ,extend方法要么是直接挂在 ...

随机推荐

  1. JAVA与多线程开发(线程基础、继承Thread类来定义自己的线程、实现Runnable接口来解决单继承局限性、控制多线程程并发)

    实现线程并发有两种方式:1)继承Thread类:2)实现Runnable接口. 线程基础 1)程序.进程.线程:并行.并发. 2)线程生命周期:创建状态(new一个线程对象).就绪状态(调用该对象的s ...

  2. Spark系列(九)DAGScheduler工作原理

    以wordcount为示例进行深入分析 1  33  ) { 46        logInfo("Submitting " + tasks.size + " missi ...

  3. android 拍照或者图库选择 压缩后 图片 上传

    通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程 一:创建个临时文件夹用于保存压缩后需要上传的图片 /** * path:存放图片目录路径 */ private Str ...

  4. homework-03

    1.分工准备 这次的工作是结对编程,在第二次作业中我是使用python完成的作业,而小明是使用C完成的作业.因为打算使用动态链接库的方式将第二次的代码嵌入到本次的作业中,而python生成动态链接库不 ...

  5. thymeleaf中的th:each用法

    一.th:eath迭代集合用法: <table> <thead> <tr> <th>序号</th> <th>用户名</th ...

  6. Umbraco中的Member登录时的Lock out功能

    请参看文章 https://our.umbraco.org/forum/using-umbraco-and-getting-started/76389-preventing-member-lock-o ...

  7. Wifi热点工具-青青草原WiFi

    有时只有有线网络,但手机需要上网,这时需要将笔记本作为无线热点. 青青草原WiFi,这个工具用起来挺方便,http://www.22zy.net/.

  8. Velocity中#set指令

    引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容. 指令是以#开头,后面紧跟一个关键字,比如if,else,foreach等.而这个关键字,是可以被放在{}中间的.这是规范 ...

  9. .NET通用权限系统快速开发框架

    DEMO下载地址: http://download.csdn.net/detail/shecixiong/5372895 一.开发技术:B/S(.NET C# ) 1.Windows XP以上 (支援 ...

  10. cdoj 1246 每周一题 拆拆拆~ 分解质因数

    拆拆拆~ Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1246 Descri ...