ASP.NET地址栏form提交安全验证

以下类可以在web.config中直接配置,可以防范地址栏、表单提交的恶意数据。

安全模块作用:

a.针对URL参数验证的功能,防止sql注入

b.针对form表单XSS漏洞的防护功能

c.针对上传文件的检测功能,防范网站上传漏洞攻击

d.优化URL参数检测方式,不会对正常的js封装库拦截

e.上传文件验证jsp防护

f.正常页面参数包含select被拦截的问题

g.拦截关键字db_name/insert/drop等

安全模块使用方法:

在web.config配置文件<httpModules></httpModules>中加入以下代码:

<add name="SecModule" type="SecModule.CheckUrlParameter,SecModule" />

安全模块类文件:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Text.RegularExpressions;
using System.IO;


namespace SecModule
{
    public class CheckUrlParameter : IHttpModule
    {

        #region IHttpModule 成员

        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }
        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
            // 做些实际的工作,HttpContext对象都获得了,剩下的基本可以自由发挥了

            //检测URL安全信息
            if (!context.Request.RawUrl.Contains("WebResource") && !context.Request.RawUrl.Contains("ScriptResource") && context.Request.QueryString.Count > 0)
            {
                for (int i = 0; i < context.Request.QueryString.Count; i++)
                {
                    if (CheckUrl(context.Request.QueryString[i]))
                    {
                        context.Response.Redirect("~/UserControl/ErrorPage.html?err=6");
                        context.Response.End();
                    }
                }
            }

            //检测上传文件的安全信息
            string ext = "";
            for (int i = 0; i < context.Request.Files.Count; i++)
            {
                ext = Path.GetExtension(context.Request.Files[i].FileName).ToLower();
                if (ext == ".aspx" || ext == ".asp" || ext == ".php" || ext == ".jsp")
                {
                    context.Response.Write("<script type='text/javascript'>alert('禁止上传非法文件!');location.href=location.href;</script>");
                    context.Response.End();
                }
            }

            //检测Form表单值的安全信息
            string parmeter = "";
            for (int i = 0; i < context.Request.Form.Count; i++)
            {

                parmeter = context.Request.Form[i];
                if (context.Request.Form.AllKeys[i] == "__VIEWSTATE") continue;
                if (CheckForm(parmeter))
                {
                    if (context.Request.RawUrl.ToLower().Contains("ajax"))
                    {
                        context.Response.Write("输入内容有非法字符!");
                    }
                    else
                    {
                        context.Response.Write("<script type='text/javascript'>alert('输入内容有非法字符!');location.href=location.href;</script>");
                    }
                    context.Response.End();
                }
            }
        }
        /// <summary>
        /// 检测URL参数
        /// </summary>
        /// <param name="parameter">传入参数值</param>
        /// <returns>有危险返回True,无返回False</returns>
        public bool CheckUrl(string parameter)
        {
            Regex reg = new Regex("--|\"|\'|=|db_name|<script>|[*]|sysobjects|sysdatabases|syscolumns|select|from|drop|delete|insert|update|exec", RegexOptions.IgnoreCase);
            return reg.IsMatch(parameter);
        }

        /// <summary>
        /// 检测Form表单
        /// </summary>
        /// <param name="FormValue">传入表单值</param>
        /// <returns></returns>
        public bool CheckForm(string FormValue)
        {
            Regex reg = new Regex("--|db_name|<script>|drop|insert", RegexOptions.IgnoreCase);
            return reg.IsMatch(FormValue);
        }

        #endregion
    }
}

 

你可能感兴趣的:(ASP.NET地址栏form提交安全验证)