網(wǎng)站安全通用防護(hù)代碼(C#版本源碼提供)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
每一個(gè)開發(fā)者都會意識到,網(wǎng)站發(fā)布之前,需要進(jìn)行安全檢查。 那么如何攔截攻擊者注入惡意代碼?如何防御諸如跨站腳本攻擊(XSS)、SQL注入攻擊等惡意攻擊行為? 針對目前常見的一些安全問題,結(jié)合目前一些常見的防護(hù)辦法,通用權(quán)限管理系統(tǒng)底層增加了安全防護(hù)代碼, 現(xiàn)將源碼提供如下 namespace DotNet.Utilities { /// <summary> /// 網(wǎng)站安全通用防護(hù) /// /// 主要功能: /// 攔截攻擊者注入惡意代碼,可以防御諸如跨站腳本攻擊(XSS)、SQL注入攻擊等惡意攻擊行為。 /// /// 修改紀(jì)錄 /// /// 2013-12-27,更新正則表達(dá)式避免誤報(bào)問題。 /// 2013-01-08,更新了aspx防護(hù)腳本中referer變量沖突問題。 /// 2013-01-09,加入了UTF7編碼XSS的防護(hù)。 /// 2013-01-28,增強(qiáng)了對XSS的防護(hù)。 /// 2013-01-31,針對某些用戶后臺上傳文件出錯(cuò)的問題。 /// 2013-03-15,增強(qiáng)了對POST的防護(hù)。 /// 2013-03-28,增強(qiáng)了對XSS的防護(hù)。 /// 2013-04-25,對XSS防護(hù)加入了通用的防護(hù)方法。 /// 2013-08-02,加入對XSS編碼繞過的防護(hù)。 /// 2013-08-14,增強(qiáng)利用樣式的XSS防護(hù)。 /// 2014-11-12,解決SQL盲注不攔截的問題。 /// /// 2014-11-12 版本:1.0 SongBiao 創(chuàng)建文件。 /// /// <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; } } } } 源碼在通用權(quán)限底層中的位置: 調(diào)用方法:(ASP.NET MVC參考)在Global.asax文件中增加以下方法 /// <summary> /// 在此處進(jìn)行安全檢測和防范 /// 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數(shù)據(jù)有惡意字符!", putData); } } if (Request.UrlReferrer != null) { if (SecretUtil.Referer(out putData)) { ResponseWarnMessage(context, "Referrer數(shù)據(jù)有惡意字符!", putData); } } if (Request.RequestType.ToUpper() == "POST") { if (SecretUtil.PostData(out putData)) { ResponseWarnMessage(context, "Post數(shù)據(jù)有惡意字符!", putData); } } if (Request.RequestType.ToUpper() == "GET") { if (SecretUtil.GetData(out putData)) { ResponseWarnMessage(context, "Get數(shù)據(jù)有惡意字符!", 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; //非安全行為同時(shí)記錄到數(shù)據(jù)庫和文本文件中 LogHelper.OracleWarn(userInfo, "惡意訪問行為", "來自IP:" + ipAddress + "的訪問存在惡意行為:" + errorMessage + "字符內(nèi)容:" + 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 + "字符內(nèi)容:" + putData); IController errorController = new ErrorController(); errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); context.Response.End(); } 上面的處理方法可根據(jù)需要自己調(diào)整,我是將攻擊信息使用系統(tǒng)的日志功能記錄到Oracle數(shù)據(jù)庫中,并在頁面顯示攻擊信息, 測試:在地址后加入"?action=delete from user" 以上安全代碼也可單獨(dú)放到你的程序中使用,建議尚未做安全防護(hù)的朋友盡快加上,避免受到一些常見的攻擊行為騷擾。
該文章在 2018/9/8 18:57:19 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |