<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        asp.net利用HttpModule實現(xiàn)防sql注入

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:43:38
        文檔

        asp.net利用HttpModule實現(xiàn)防sql注入

        asp.net利用HttpModule實現(xiàn)防sql注入:1、新建一個類,實現(xiàn)IHttpModule接口 代碼 代碼如下:public class SqlHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AcquireRequestSta
        推薦度:
        導(dǎo)讀asp.net利用HttpModule實現(xiàn)防sql注入:1、新建一個類,實現(xiàn)IHttpModule接口 代碼 代碼如下:public class SqlHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AcquireRequestSta

        1、新建一個類,實現(xiàn)IHttpModule接口
        代碼
        代碼如下:

        public class SqlHttpModule : IHttpModule
        {
        public void Dispose()
        {
        }
        public void Init(HttpApplication context)
        {
        context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
        }
        }

        在實現(xiàn)接口的Init方法時,我們選擇了AcquireRequestState事件,為什么不是Begin_Request事件呢?這是因為我們在處理的時候可能用的session,而Begin_Request事件執(zhí)行的時候還沒有加載session狀態(tài)(關(guān)于HttpModule可以參考這一篇)。
        2、對網(wǎng)站提交的數(shù)據(jù)進(jìn)行處理
        (1)、GET方式
        代碼
        代碼如下:

        //url提交數(shù)據(jù) get方式
        if (context.Request.QueryString != null)
        {
        for (int i = 0; i < context.Request.QueryString.Count; i++)
        {
        key = context.Request.QueryString.Keys[i];
        value = context.Server.UrlDecode(context.Request.QueryString[key]);
        if (!FilterSql(value))
        {
        throw new Exception("QueryString(GET) including dangerous sql key word!");
        }
        }
        }

        (2)、POST方式
        代碼
        代碼如下:

        //表單提交數(shù)據(jù) post方式
        if (context.Request.Form != null)
        {
        for (int i = 0; i < context.Request.Form.Count; i++)
        {
        key = context.Request.Form.Keys[i];
        if (key == "__VIEWSTATE") continue;
        value = context.Server.HtmlDecode(context.Request.Form[i]);
        if (!FilterSql(value))
        {
        throw new Exception("Request.Form(POST) including dangerous sql key word!");
        }
        }
        }

        完整代碼:
        代碼
        代碼如下:

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Text;
        namespace DotNet.Common.WebForm
        {
        /// <summary>
        /// 簡單防止sql注入
        /// </summary>
        public class SqlHttpModule : IHttpModule
        {
        public void Dispose()
        {
        }
        public void Init(HttpApplication context)
        {
        context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
        }
        /// <summary>
        /// 處理sql注入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void context_AcquireRequestState(object sender, EventArgs e)
        {
        HttpContext context = ((HttpApplication)sender).Context;
        try
        {
        string key = string.Empty;
        string value = string.Empty;
        //url提交數(shù)據(jù) get方式
        if (context.Request.QueryString != null)
        {
        for (int i = 0; i < context.Request.QueryString.Count; i++)
        {
        key = context.Request.QueryString.Keys[i];
        value = context.Server.UrlDecode(context.Request.QueryString[key]);
        if (!FilterSql(value))
        {
        throw new Exception("QueryString(GET) including dangerous sql key word!");
        }
        }
        }
        //表單提交數(shù)據(jù) post方式
        if (context.Request.Form != null)
        {
        for (int i = 0; i < context.Request.Form.Count; i++)
        {
        key = context.Request.Form.Keys[i];
        if (key == "__VIEWSTATE") continue;
        value = context.Server.HtmlDecode(context.Request.Form[i]);
        if (!FilterSql(value))
        {
        throw new Exception("Request.Form(POST) including dangerous sql key word!");
        }
        }
        }
        }
        catch (Exception ex)
        {
        throw ex;
        }
        }
        /// <summary>
        /// 過濾非法關(guān)鍵字,這個可以按照項目靈活配置
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private bool FilterSql(string key)
        {
        bool flag = true;
        try
        {
        if (!string.IsNullOrEmpty(key))
        {
        //一般配置在公共的文件中,如xml文件,txt文本等等
        string sqlStr = "insert |delete |select |update |exec |varchar |drop |creat |declare |truncate |cursor |begin |open|<-- |--> ";
        string[] sqlStrArr = sqlStr.Split('|');
        foreach (string strChild in sqlStrArr)
        {
        if (key.ToUpper().IndexOf(strChild.ToUpper()) != -1)
        {
        flag = false;
        break;
        }
        }
        }
        }
        catch
        {
        flag = false;
        }
        return flag;
        }
        }
        }

        3、在web項目中應(yīng)用
        只要在web.config的httpModules節(jié)點下面添加如下配置即可。
        <httpModules>
        <add name="SqlHttpModule" type="DotNet.Common.WebForm.SqlHttpModule, DotNet.Common.WebForm"></add>
        </httpModules>
        需要說明的是,這個防止sql注入的方法在特定的小項目中還是很簡潔高效的,但是不通用,通常我們都是選擇參數(shù)化(利用orm或者ado.net的參數(shù)化)方式防止sql注入。
        附:asp.net在網(wǎng)頁頭部引入js腳本的簡單方法
        asp.net開發(fā)少不了JavaScript的輔助。在通常項目中,js文件都組織在一個公共目錄如js文件夾下。隨著項目的深入,你會發(fā)現(xiàn)js腳本文件越來越多,公共的腳步庫越來越龐大。實際使用的時候,我們通常都是在頁面中通過 <script src="..." type="text/javascript" >形式引入js文件,而且引入的越來越多。下面我們就來簡單討論在每個頁面引入公共腳本庫的統(tǒng)一方式,而不用每個頁面都是很多<script src="..." type="text/javascript" >的形式。
        和我們以前的做法一樣,定義一個頁面基類叫BasePage,事件和方法如下:
        Code
        代碼如下:

        using System;
        using System.Data;
        using System.Configuration;
        using System.Collections.Generic;
        using System.Web;
        using System.Web.Security;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Web.UI.WebControls.WebParts;
        using System.Web.UI.HtmlControls;
        using System.Reflection;
        using System.Text;
        using System.IO;
        namespace DotNet.Common.WebForm
        {
        using DotNet.Common.Model;
        using DotNet.Common.Util;
        public class BasePage : System.Web.UI.Page
        {
        public BasePage()
        {
        }
        protected override void OnInit(EventArgs e)
        {
        base.OnInit(e);
        AddHeaderJs();//向網(wǎng)頁頭部添加js等文件
        }
        #region 網(wǎng)頁頭添加通用統(tǒng)一js文件
        private void AddHeaderJs()
        {
        string jsPath = "~/js/";
        string filePath = Server.MapPath(jsPath);
        Literal lit = new Literal();
        StringBuilder sb = new StringBuilder();
        if (!Directory.Exists(filePath))
        throw new Exception("路徑不存在");
        List<string> listJs = new List<string>();
        foreach (var item in Directory.GetFiles(filePath, "*.js", SearchOption.TopDirectoryOnly))
        {
        listJs.Add(Path.GetFileName(item));
        }
        foreach (var jsname in listJs)
        {
        sb.Append(ScriptInclude(jsPath + jsname));
        }
        lit.Text = sb.ToString();
        Header.Controls.AddAt(1, lit);
        }
        private string ResolveHeaderUrl(string relativeUrl)
        {
        string url = null;
        if (string.IsNullOrEmpty(relativeUrl))
        {
        url = string.Empty;
        }
        else if (!relativeUrl.StartsWith("~"))
        {
        url = relativeUrl;
        }
        else
        {
        var basePath = HttpContext.Current.Request.ApplicationPath;
        url = basePath + relativeUrl.Substring(1);
        url = url.Replace("http://", "/");
        }
        return url;
        }
        private string ScriptInclude(string url)
        {
        if (string.IsNullOrEmpty(url))
        throw new Exception("路徑不存在");
        string path = ResolveHeaderUrl(url);
        return string.Format(@"<script src='{0}' type='text/javascript'></script>", path);
        }
        #endregion
        }
        }

        這樣就簡單地解決了引入公共js的問題。同樣的原理,你也可以引入其他類型的文件,如css等。
        demo下載

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        asp.net利用HttpModule實現(xiàn)防sql注入

        asp.net利用HttpModule實現(xiàn)防sql注入:1、新建一個類,實現(xiàn)IHttpModule接口 代碼 代碼如下:public class SqlHttpModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.AcquireRequestSta
        推薦度:
        標(biāo)簽: 注入 asp 防止sql注入
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产一区二区三区青草影视| 99久久精品免费精品国产| 亚洲av无码成h人动漫无遮挡| 日韩大片免费观看视频播放 | 91亚洲国产成人久久精品网站| 毛片基地看看成人免费| 亚洲熟妇无码另类久久久| 国产97视频人人做人人爱免费| 在线亚洲人成电影网站色www| 免费国产污网站在线观看| 亚洲av无码成h人动漫无遮挡| 亚洲国产精品免费视频| 91亚洲精品麻豆| 毛片免费观看视频| 麻豆亚洲AV成人无码久久精品| 日韩免费的视频在线观看香蕉| 久久精品国产亚洲综合色| 亚洲精品乱码久久久久蜜桃| 四虎永久在线免费观看| 一级白嫩美女毛片免费| 亚洲av无码一区二区三区不卡 | 日韩黄色免费观看| 99人中文字幕亚洲区 | 无码精品人妻一区二区三区免费看| 久久夜色精品国产噜噜噜亚洲AV | 亚洲AV无码乱码在线观看富二代 | 国产高清免费视频| 亚洲a∨无码精品色午夜| 久久综合亚洲色HEZYO国产| 日韩精品免费在线视频| 亚洲一区二区无码偷拍| 又粗又硬又黄又爽的免费视频| 成全在线观看免费观看大全| 亚洲国产成人综合| 亚洲国产人成精品| 亚洲AV无码国产精品色| 午夜国产大片免费观看| 99热这里只有精品免费播放| 中文字幕乱码亚洲精品一区| 国产亚洲精品免费视频播放| 91精品视频免费|