网站安全通用防护代码(C#版本源码提供)

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

那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(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 = 0; 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 = 0; 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 = 0; 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"

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

时间: 2024-10-11 17:44:14

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

网站安全通用防护代码(用户读写数据库对用户输入或者发送(Post、Get)数据等进行检测过滤等)

每一个开发者都会意识到,网站发布之前,需要进行安全及系统漏洞检查. 那么如何拦截攻击者注入恶意脚本或代码?如何防御诸如跨站脚本攻击(XSS).SQL注入攻击等恶意攻击行为? 针对目前常见的一些安全问题,结合目前一些常见的防护办法,可在系统底层增加了安全防护代码. [Description("网站安全通用防护代码(用户读写数据库对用户输入或者发送(Post.Get)数据等进行检测过滤等),跨站脚本攻击(XSS).SQL注入攻击等恶意攻击")] public partial class S

Spring各版本源码下载

spring framework 各版本源码下载地址 现在spring的源码下载地址真是不好找,这次终于找到了.记录一下,以帮助需要的朋友. https://github.com/spring-projects/spring-framework/tags可以选择需要的版本进行下载. 感谢网友 xiyuan1999 在csdn上提供的此下载地址.

可解决由于IIS、VS低版本源码 兼容性问题。

安装完 Internet Information Services和 Web 管理工具 后,重启VS,以管理员身份打开,同时 选择源码--属性--安全--添加 everyone 所有权限,配置IIS,即可解决由于IIS.VS低版本源码 兼容性问题. 解决方法: 重新启动时  右键 选以管理员身份运行 那是兼容性还没配置把 控制面板-程序和功能 打开或关闭 Windows 功能 找到这个Internet Information Services 展开Web 管理工具 安装完 Internet In

Android4.4版本源码变化

一,WifiManager 新增: 1 public void setTdlsEnabled (InetAddress remoteIPAddress, boolean enable) 2 3 Enable/Disable TDLS on a specific local route. 4 5 TDLS enables two wireless endpoints to talk to each other directly without going through the access po

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

Goldeneye压力测试工具的源代码,粗略看了下,代码写的蛮规范和易读的,打算边读边加上了中文注释,但是想来也没太大必要,代码600多行,值得学习的地方还是蛮多的,喜欢Python的同学可以一读 这个是Github上的最新版本了,2.1版,相比之前的2.0版本(2013年),作者删去了耦合在代码中的useragents self.useragents = [ 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/2009091

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

目录 1 . jquery extend的基本使用 通过285行的源码 jQuery.extend = jQuery.fn.extend = function() { ,extend方法要么是直接挂在到jQuery的静态方法,要么是挂载到fn上其实就是原型上(参考283行的赋值操作)的实例方法.extend方法可以传一个对象,类似于插件的方式,也可以传多个对象进行拷贝. <script src="js/jquery-2.0.3.js"></script> <

【开源】ZXING的.NET版本源码解析

[概述] ZXing ("zebra crossing") is an open-source, multi-format 1D/2D barcode image processing library implemented in Java, with ports to other languages. 开源地址: https://github.com/zxing/zxing [工程结构] 以ZXing.Net.Source.0.14.0.0版本为例,此文件目录下对应两个工程: Bas

[STL]&lt;list&gt;-P.J 版本源码简单分析

此版本的list类,很多信息都保存在内部类里面.如果抛开这些内部类,list类里面实质的成员只包括三个: protected: _A allocator; //空间配置器 _Nodeptr _Head; //list节点 size_type _Size; //list内元素个数 抛开空间配置器不谈,_Head节点是一个_Node类型的指针 struct _Node; friend struct _Node; typedef _POINTER_X(_Node, _A) _Nodeptr; stru

Apache Ranger0.6版本源码编译

1 Ranger简介 Apache Ranger提供一个集中式安全管理框架,它可以对Hadoop生态的组件如Hive,Hbase进行细粒度的数据访问控制.通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问HDFS文件夹.HDFS文件.数据库.表.字段权限.这些策略可以为不同的用户和组来设置,同时权限可与hadoop无缝对接. 2 准备 2.1 环境说明 1 Ranger源码编译依赖如下linux组件:maven,git,gcc,MySQL 2 安装git和gcc时采用yum安