• asp.net C# 全站防注入 利用Global.asax(转)


    全站防注入通用程序

    在站点根目录下建立Global.asax应用程序文件,这新就可以全站防注入了。程序内容如下:

    <%@ Application Language="C#" %>

    <script runat="server">

        void Application_Start(object sender, EventArgs e)
        {
            //在应用程序启动时运行的代码

        }
        void Application_End(object sender, EventArgs e)
        {
            //在应用程序关闭时运行的代码

        }
        void Application_Error(object sender, EventArgs e)
        {
            //在出现未处理的错误时运行的代码

        }

        void Session_Start(object sender, EventArgs e)
        {
            //在新会话启动时运行的代码

        }

        void Session_End(object sender, EventArgs e)
        {
            //在会话结束时运行的代码。
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
            // InProc 时,才会引发 Session_End 事件。如果会话模式
            //设置为 StateServer 或 SQLServer,则不会引发该事件。

        }

        /// <summary>
        ///  替换所有注入的字符串,并记录注入时的信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Application_BeginRequest(object sender, EventArgs e)
        {
      // * * * * * * * * * * * * * * * * * * * * * * * *
      // 全局防注入
      // Author:依依秋寒
      // * * * * * * * * * * * * * * * * * * * * * * * *

            //在接收到一个应用程序请求时触发。
            string[] KeyWords = new string[] { ";", "'", "--", "xp_", "XP_", "xP_", "Xp_" };
            string[] safeKeys = "&#59;|&#39;|&#45;&#45;|&#120;&#112;&#95;|&#88;&#80;&#95;|&#120;&#80;&#95;|&#88;&#112;&#95;".Split('|');
            string QueryString = Server.UrlDecode(Request.QueryString.ToString());
            string url = Request.Url.AbsolutePath;
            //排除的扩展名
            string[] dotFileName = url.Split('.');
            string dotName = dotFileName[dotFileName.Length - 1];
            dotFileName = new string[] { "axd" };
            //出现被排除的扩展名时,直接退出
            foreach (string str in dotFileName)
            {
                if (str == dotName)
                    return;
            }
            for(int i=0;i<KeyWords.Length ;i++)
            {
                string key = KeyWords[i];
                if (QueryString.Contains(key))
                {
                    //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
                    //记录注入时的信息
                    //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
                    string IntoRecord = System.DateTime.Now.ToString();
                    IntoRecord += " " + Request.Url.Host;
                    IntoRecord += " " + Request.RequestType;
                    IntoRecord += " " + Request.Url.AbsolutePath;
                    IntoRecord += " " + Server.UrlDecode(Request.QueryString.ToString());
                    IntoRecord += " " + Request.UserHostAddress;
                    IntoRecord += " " + Request.UserAgent;
                    IntoRecord += "\r";

                    try
                    {
                        string path = Server.MapPath(@"/_IntoRecordLog/");
                        if (!System.IO.Directory.Exists(path))
                            System.IO.Directory.CreateDirectory(path);
                        System.IO.File.AppendAllText(path + DateTime.Now.ToString("yyyyMMdd") + ".log", IntoRecord, System.Text.Encoding.Default);
                    }
                    catch { }
                    //替换注入的URL,并进行跳转
                    QueryString = QueryString.Replace(key, safeKeys[i]);
                    Response.Redirect(url + "?" + QueryString);
                    Response.End();
                }
            }
        }
    </script>

  • 相关阅读:
    java 笔记(2) 接口作为引用数据类型
    linux 笔记(5)让vi或vim显示行数和不显示行数
    linux 笔记(4)Ubuntu 使用时vi编辑器时,不能使用backspace键来进行退格或者不能正常使用
    linux 笔记(3)sudo passwd 设置root用户的密码
    matlab笔记(1) 元胞结构cell2mat和num2cell
    linux 笔记(2) 目录直接强行删除rm -rf *(删除当前目录所有的内容)
    linux 笔记(1) ctrl+c,ctrl+z,ctrl+d
    C51单片机项目:红绿灯
    C51单片机项目:时钟
    java 笔记(1)在子类中,一定要访问父类的有参构造方法?
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/2990930.html
Copyright © 2020-2023  润新知