<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
        主站蜘蛛池模板: 精品成人免费自拍视频| 色妞WWW精品免费视频 | 亚洲五月六月丁香激情| 最近2019中文字幕免费大全5 | 亚洲精品天天影视综合网| 国产无人区码卡二卡三卡免费| 亚洲暴爽av人人爽日日碰| 亚洲线精品一区二区三区| 一区二区无码免费视频网站| 无遮挡a级毛片免费看| 亚洲国产人成网站在线电影动漫| 青青草国产免费久久久下载| 丰满人妻一区二区三区免费视频| 91亚洲自偷在线观看国产馆| 亚洲欧洲日本在线| 成年大片免费视频| 国产成人无码区免费网站| 亚洲大尺度无码无码专线一区| 亚洲AV午夜福利精品一区二区| 在线免费观看a级片| 中文字幕在线免费看线人| 亚洲爆乳无码精品AAA片蜜桃| 久久亚洲精品中文字幕无码| 日本一道本高清免费| 30岁的女人韩剧免费观看| 一个人看的hd免费视频| 亚洲av中文无码乱人伦在线观看 | 99ri精品国产亚洲| 亚洲精品无码久久不卡| 在线a毛片免费视频观看| 美女内射无套日韩免费播放| 国产黄色片免费看| 羞羞漫画小舞被黄漫免费| 亚洲一级黄色大片| 麻豆亚洲AV永久无码精品久久| 亚洲精品国产精品乱码不卡| 成人免费午夜视频| 国拍在线精品视频免费观看| 免费A级毛片无码A∨| 免费一级不卡毛片| 中国国语毛片免费观看视频|