zoukankan      html  css  js  c++  java
  • 网站安全通用防护代码在ASP.NET MVC 中的应用实例(接上一篇)

    处理Get、Post等网站请求及Cookie数据监测等,防护网站。

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

    1、在Global.asax.cs文件中添加如下代码:

     #region  网站安全防护代码
    
    
            /// <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 (SafeUtils.CookieData(out putData))
                    {
                        ResponseWarnMessage(context, "Cookie数据有恶意字符!", putData);
                    }
                }
                if (Request.UrlReferrer != null)
                {
                    if (SafeUtils.Referer(out putData))
                    {
                        ResponseWarnMessage(context, "Referrer数据有恶意字符!", putData);
                    }
                }
                if (Request.RequestType.ToUpper() == "POST")
                {
                    if (SafeUtils.PostData(out putData))
                    {
                        ResponseWarnMessage(context, "Post数据有恶意字符!", putData);
                    }
                }
                if (Request.RequestType.ToUpper() == "GET")
                {
                    if (SafeUtils.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 = IpHelper.GetIP();
                //把攻击日志记录到日志文本文件中
                LogHelper.WriteLog("恶意访问行为  " + "来自IP:" + ipAddress + "的访问存在恶意行为:" + errorMessage + "  字符内容:" + putData, 1);
    
                //BaseUserInfo userInfo = context.Session[DotNet.Business.Utilities.SessionName] as BaseUserInfo;
                //非安全行为同时记录到数据库和文本文件中
                //LogHelper.WriteLog(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();
            }
    
           #endregion

    2、在网站Web.config文件中添加如下配置:

      (1)、在system.web节点下的httpRuntime节点添加:requestValidationMode="2.0

     (2)、在system.web节点下的pages节点添加:validateRequest="false"

    目的:   用于比如从客户端中检测到有潜在危险的 Request.QueryString 值等情况的报错,让后台可以正常获取到危险字符。

    <system.web>
        <httpRuntime     requestValidationMode="2.0" />
    
    
    
    <pages validateRequest="false" >

    3、新增控制器:ErrorController        。并在其内添加视图页:General

     public ActionResult General(string title, string error, int icon = 5, string returnUrl = "/Home/Index")
            {
                ViewBag.Title = title;
                ViewBag.Msg = error?? "系统出错或您无权访问!";
                ViewBag.Icon = icon;
                ViewBag.ReturnUrl = returnUrl;
                return View();
            }

    4、General视图页代码如下(引用到了LayUI框架):

    @{
        Layout = null;
    }
    
    @{
        var title = ViewBag.Title;
        var msg = ViewBag.Msg;
        var icon = ViewBag.Icon;
        var returnUrl = ViewBag.ReturnUrl;
    }
    
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=ie10,chrome=1">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    
        <link rel="Shortcut Icon" href=/favicon.ico> 
        <title>@(title)</title>
        <link href="~/Content/layui/src/css/layui.css" rel="stylesheet"/>
    </head>
    <body>
    <div>
    
    </div>
    </body>
    
    <script type="text/javascript" src="~/Content/layui/src/layui.js"></script>
    <script type="text/javascript">
        //JavaScript代码区域
        layui.use(['form', 'element', 'jquery', 'layer'], function() {
            var element = layui.element;
            var form = layui.form,
                layer = layui.layer,
                $ = layui.jquery;
    
        });
    </script>
    
    
    <script type="text/javascript">
            layui.use(['layer'], function () {
    
                var layer = layui.layer;
    
    
                layer.alert('@msg',
                {
                    icon: '@icon',  // 1:勾 2:× 3:问号 4:锁  5:提醒 6:笑脸  7:叹号
                    closeBtn: 0,//不显示关闭按钮
                }, function () {
                    window.location.href = '@returnUrl';
                });
    
    
            });
    
    
    </script>
    
    
    
    </html>

    以下为测试效果图:

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

  • 相关阅读:
    生成类似于MongoDB产生的ObjectId
    链式编程:遇到多个构造器参数(Constructor Parameters)时要考虑用构建器(Builder)
    mysql时间字符串按年/月/天/时分组查询 -- date_format
    根据模板导出excel
    九度 1188 约瑟夫环问题
    快速排序
    Linux 命令
    volatile小记
    线程池ThreadPoolExecutor
    CyclicBarrier、CountDownLatch与Semaphore的小记
  • 原文地址:https://www.cnblogs.com/sharing1986687846/p/10281728.html
Copyright © 2011-2022 走看看