閱讀630 返回首頁    go 技術社區[雲棲]


網站跨站點腳本,Sql注入等攻擊的處理

從360安全論壇裏找到的一段代碼,經過整理封裝,直接在站點Global.asax文件或寫一個HttpModule來攔截惡意請求即可;

https://bbs.webscan.360.cn/forum.php?mod=viewthread&tid=711&page=1&extra=#pid1927 

using System.Text.RegularExpressions;
using System.Web;

/// <summary>
/// Web請求安全檢查:防止跨站點腳本,Sql注入等攻擊,來自:https://bbs.webscan.360.cn/forum.php?mod=viewthread&tid=711&page=1&extra=#pid1927
/// 檢查數據包括:
/// 1.Cookie
/// 2.當前頁麵地址
/// 3.ReferrerUrl
/// 4.Post數據
/// 5.Get數據
/// </summary>
public class Safe360
{
    #region 執行安全檢查

    /// <summary>
    /// 執行安全檢查
    /// </summary>
    public static void Procress()
    {
        const string errmsg =
            "<div style='position:fixed;top:0px;width:100%;height:100%;background-color:white;color:green;font-weight:bold;border-bottom:5px solid #999;'><br>您的提交帶有不合法參數,謝謝合作!<br><br>了解更多請點擊:<a href='https://webscan.360.cn'>360網站安全檢測</a></div>";

        if (RawUrl())
        {
            HttpContext.Current.Response.Write(errmsg);
            HttpContext.Current.Response.End();
        }

        if (CookieData())
        {
            HttpContext.Current.Response.Write(errmsg);
            HttpContext.Current.Response.End();
        }

        if (HttpContext.Current.Request.UrlReferrer != null)
        {
            if (Referer())
            {
                HttpContext.Current.Response.Write(errmsg);
                HttpContext.Current.Response.End();
            }
        }

        if (HttpContext.Current.Request.RequestType.ToUpper() == "POST")
        {
            if (PostData())
            {
                HttpContext.Current.Response.Write(errmsg);
                HttpContext.Current.Response.End();
            }
        }
        if (HttpContext.Current.Request.RequestType.ToUpper() == "GET")
        {
            if (GetData())
            {
                HttpContext.Current.Response.Write(errmsg);
                HttpContext.Current.Response.End();
            }
        }
    }

    #endregion

    #region 安全檢查正則

    /// <summary>
    /// 安全檢查正則
    /// </summary>
    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)";

    #endregion

    #region 檢查Post數據

    /// <summary>
    /// 檢查Post數據
    /// </summary>
    /// <returns></returns>
    private static bool PostData()
    {
        bool result = false;

        for (int i = 0; i < HttpContext.Current.Request.Form.Count; i++)
        {
            result = CheckData(HttpContext.Current.Request.Form[i]);
            if (result)
            {
                break;
            }
        }
        return result;
    }

    #endregion

    #region 檢查Get數據

    /// <summary>
    /// 檢查Get數據
    /// </summary>
    /// <returns></returns>
    private static bool GetData()
    {
        bool result = false;

        for (int i = 0; i < HttpContext.Current.Request.QueryString.Count; i++)
        {
            result = CheckData(HttpContext.Current.Request.QueryString[i]);
            if (result)
            {
                break;
            }
        }
        return result;
    }

    #endregion

    #region 檢查Cookie數據

    /// <summary>
    /// 檢查Cookie數據
    /// </summary>
    /// <returns></returns>
    private static bool CookieData()
    {
        bool result = false;
        for (int i = 0; i < HttpContext.Current.Request.Cookies.Count; i++)
        {
            result = CheckData(HttpContext.Current.Request.Cookies[i].Value.ToLower());
            if (result)
            {
                break;
            }
        }
        return result;
    }

    #endregion

    #region 檢查Referer

    /// <summary>
    /// 檢查Referer
    /// </summary>
    /// <returns></returns>
    private static bool Referer()
    {
        return CheckData(HttpContext.Current.Request.UrlReferrer.ToString());
    }

    #endregion

    #region 檢查當前請求路徑

    /// <summary>
    /// 檢查當前請求路徑
    /// </summary>
    /// <returns></returns>
    private static bool RawUrl()
    {
        return CheckData(HttpContext.Current.Request.RawUrl);
    }

    #endregion

    #region 正則匹配

    /// <summary>
    /// 正則匹配
    /// </summary>
    /// <param name="inputData"></param>
    /// <returns></returns>
    private static bool CheckData(string inputData)
    {
        return Regex.IsMatch(inputData, StrRegex);
    }

    #endregion
}

在Global.asax裏調用的代碼:

    private void Application_BeginRequest(object sender, EventArgs e)
    {
        Safe360.Procress();

    }



最後更新:2017-04-03 12:56:12

  上一篇:go 如何使sublime text側邊工程欄一直打開的狀態
  下一篇:go Cocos2dx 3.0 過渡篇(十一) xml文檔的讀取與調用