最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

asp.net 預(yù)防SQL注入攻擊之我見

 更新時(shí)間:2009年11月26日 19:07:12   作者:  
說起防止SQL注入攻擊,感覺很郁悶,這么多年了大家一直在討論,也一直在爭論,可是到了現(xiàn)在似乎還是沒有定論。當(dāng)不知道注入原理的時(shí)候會(huì)覺得很神奇,怎么就被注入了呢?會(huì)覺得很難預(yù)防。但是當(dāng)知道了注入原理之后預(yù)防不就是很簡單的事情了嗎?
1、 SQL注入攻擊的本質(zhì):讓客戶端傳遞過去的字符串變成SQL語句,而且能夠被執(zhí)行。
2、 每個(gè)程序員都必須肩負(fù)起防止SQL注入攻擊的責(zé)任。
  說起防止SQL注入攻擊,感覺很郁悶,這么多年了大家一直在討論,也一直在爭論,可是到了現(xiàn)在似乎還是沒有定論。當(dāng)不知道注入原理的時(shí)候會(huì)覺得很神奇,怎么就被注入了呢?會(huì)覺得很難預(yù)防。但是當(dāng)知道了注入原理之后預(yù)防不就是很簡單的事情了嗎?
  第一次聽說SQL注入攻擊的時(shí)候還是在2004年(好像得知的比較晚),那是還是在寫asp呢。在一次寫代碼的時(shí)候,有同事問我,你的這段代碼防注入攻擊了嗎?什么攻擊?這是什么呀。
  后來到網(wǎng)上各種找,終于弄明白了是怎么攻擊進(jìn)來的了。注入攻擊都是來自于客戶端,無論是表單提交、URL傳值還是Cookie等,其實(shí)原理都是一樣的。到了服務(wù)器端可以分成三種情況:數(shù)字、日期時(shí)間、字符串。
一、數(shù)字。
  如何注入?
  假設(shè)我們要實(shí)現(xiàn)一個(gè)顯示新聞的頁面,我們可能會(huì)隨手寫下下面的代碼:
復(fù)制代碼 代碼如下:

string id = Request.QueryString["id"];
string sql = "select * from news where ColID=" + id;

  如果傳遞過來的 id是我們想像的 數(shù)字(比如168),那么自然不會(huì)有什么問題。但是如果傳遞過來的id是“168 delete from table ”的話,那么sql的值就變成了“select * from table where ColID=168 delete from news”。對(duì)于SQL Server來說是支持一次提交多條SQL語句的,這個(gè)為我們提供了方便之余也為SQL注入敞開了大門。顯然如果這條SQL語句被執(zhí)行的話,那么news表里的記錄就都沒有了。
 那么如何預(yù)防呢?很簡單,因?yàn)镃olID字段的類型是int的,那么我們只需要驗(yàn)證一下傳遞過來的id是不是整數(shù)就可以了。是整數(shù)就不存在注入;如果不是那么就有可能存在注入。即使不存在注入,把一個(gè)不是整數(shù)的id拼接進(jìn)去也會(huì)造成執(zhí)行錯(cuò)誤。
  所以說不管是不是為了預(yù)防SQL注入,也都應(yīng)該驗(yàn)證id是不是整數(shù)?! ?
  驗(yàn)證方法嘛,可以用TryParse,可以用正則,也可以自己寫函數(shù)驗(yàn)證。但是不建議用try異常的方式,因?yàn)檫@個(gè)有效率問題。
  這里還有一個(gè)特殊情況,就是對(duì)于批量刪除這類的會(huì)傳遞過來多個(gè)數(shù)字,比如“1,2,3,10”,這個(gè)也需要驗(yàn)證一下,萬一有人利用這個(gè)漏洞呢。至于驗(yàn)證方法也很簡單,自己寫個(gè)函數(shù)就ok了。
二、日期時(shí)間
  這個(gè)和數(shù)字的情況是一樣的,驗(yàn)證是不是日期時(shí)間即可。
三、字符串
  最麻煩、爭議最大的就是這個(gè)了。
  先看一下如何注入
  比如我們先要按照新聞標(biāo)題來進(jìn)行查詢,可能寫的代碼:
復(fù)制代碼 代碼如下:

string key = txtTitle.Text;
string sql = "select * from news where title like '%" + key + "%'";

  這個(gè)又是如何注入的呢?我想先問大家一個(gè)問題:如果key的值永遠(yuǎn)都不會(huì)包含單引號(hào),那么會(huì)不會(huì)被注入進(jìn)來?
  那么用了單引號(hào)又是如何注入的呢?假設(shè)key=" ' delete from news --" ,那么sql的值就是“ select * from news where title like '%' delete from news -- ' ”。
  先用一個(gè)單引號(hào)和前面的單引號(hào)組成一對(duì)封閉的單引號(hào),這一對(duì)單引號(hào)內(nèi)部('%')就作為字符串處理,而外面的就被作為SQL語句處理,而第二個(gè)單引號(hào)被 “--”給注釋掉了,這樣就保證了整個(gè)sql語句的正確性。
  這是注入的一種方法。
  那么如何來防止呢?想想剛才的問題,如果沒有單引號(hào)是不是就天下太平了呢?對(duì)于這種情況(前面的“數(shù)字”的情況不算),到目前為止我是沒發(fā)現(xiàn)不用單引號(hào),還能夠注入進(jìn)來的方法。也許是我孤陋寡聞吧,不知道各位高手是否知道對(duì)于這種情況,不用單引號(hào)還能注入進(jìn)來的方法。
  既然找到了罪魁禍?zhǔn)祝敲淳秃棉k了,把單引號(hào)干掉就ok了。key = key.Replace("'", "''");這時(shí)候sql的值就是” select * from news where title like '%'' delete from news --'”。
  對(duì)于SQL 來說在一對(duì)單引號(hào)內(nèi)部的兩個(gè)單引號(hào)表示一個(gè)字符串形式的單引號(hào)。這樣我們就把罪魁禍?zhǔn)赘脑斐闪俗址?。在一?duì)單引號(hào)內(nèi)的“--”也是普通的字符串而不代表注釋。
  罪魁禍?zhǔn)资菃我?hào),想不明白為什么有許多人都去過濾 “delete、update”這一類的關(guān)鍵字,他們都是安善良民呀,他們是很冤枉的。當(dāng)然了,如果前提是程序都已經(jīng)寫好了,不能修改內(nèi)部代碼,那就另當(dāng)別論了。至于“--”頂多算是幫兇,如果您不放心的話,把他處理了也行。
  總結(jié):數(shù)字、日期時(shí)間的,驗(yàn)證類型;字符串的,處理好單引號(hào)。
  另外為了安全起見,不要用sa連接數(shù)據(jù)庫,xp_cmdshell這一類的有危險(xiǎn)的擴(kuò)展存儲(chǔ)過程也應(yīng)該處理一下(比如刪除)。
ps:添加修改數(shù)據(jù)的時(shí)候可以用參數(shù)化的SQL語句,但是目的不是防止注入,而是重用執(zhí)行計(jì)劃。
還有就是js腳本的問題,這個(gè)還沒有仔細(xì)考慮,可以用html編碼的方式,也可以用替換的方式,還有ubb的漏洞等。

相關(guān)文章

  • VS2017 安裝打包插件的圖文教程

    VS2017 安裝打包插件的圖文教程

    下面小編就為大家分享一篇VS2017 安裝打包插件的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • asp.net 用戶控件讀取以及賦值

    asp.net 用戶控件讀取以及賦值

    最近項(xiàng)目中看到同事寫的一個(gè)用戶控件,是一個(gè)下拉,值是從XML中讀取的,而且這部分還用到了LINQ讀取XML的知識(shí),最近才看了一點(diǎn)點(diǎn)LINQ的知識(shí),當(dāng)記錄一下吧。
    2009-07-07
  • Equals和==的區(qū)別 公共變量和屬性的區(qū)別小結(jié)

    Equals和==的區(qū)別 公共變量和屬性的區(qū)別小結(jié)

    Equals 和==的區(qū)別 公共變量和屬性的區(qū)別 總結(jié)一下。
    2009-11-11
  • gridview行索引獲取方法及實(shí)現(xiàn)代碼(非js版)

    gridview行索引獲取方法及實(shí)現(xiàn)代碼(非js版)

    前一篇是用Javascript獲取GridView的行索引,此篇Insus.NET使用非Javascript獲取GridView的行索引,感興趣的朋友可以了解下
    2013-01-01
  • ASP.NET MVC視圖尋址

    ASP.NET MVC視圖尋址

    這篇文章介紹了ASP.NET MVC視圖尋址的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • .Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j

    .Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j

    Serilog 是一個(gè)用于.NET應(yīng)用程序的日志記錄開源庫,配置簡單,接口干凈,并可運(yùn)行在最新的.NET平臺(tái)上,這篇文章主要介紹了.Net?Core3.0?WebApi?項(xiàng)目框架搭建之使用Serilog替換掉Log4j,需要的朋友可以參考下
    2022-02-02
  • asp.net實(shí)現(xiàn)在XmlTextWriter中寫入一個(gè)CDATA的方法

    asp.net實(shí)現(xiàn)在XmlTextWriter中寫入一個(gè)CDATA的方法

    這篇文章主要介紹了asp.net實(shí)現(xiàn)在XmlTextWriter中寫入一個(gè)CDATA的方法,結(jié)合實(shí)例形式分析了XmlTextWriter寫入CDATA的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-04-04
  • 淺談ASP.NET中多層架構(gòu)

    淺談ASP.NET中多層架構(gòu)

    Asp.net的多層架構(gòu)主要是為了解決數(shù)據(jù)層,邏輯層,表示層等之間的關(guān)系。我的做法是這樣的:首先建立一個(gè)DataCore的基類?;惱锩娣庋b了一些低層的數(shù)據(jù)庫的基本操作,比如說數(shù)據(jù)庫聯(lián)接,調(diào)用存儲(chǔ)過程等等。
    2015-06-06
  • ASP.NET筆記之 Request 、Response 與Server的使用

    ASP.NET筆記之 Request 、Response 與Server的使用

    本篇文章小編為大家介紹,ASP.NET筆記之 Request 、Response 與Server的使用。需要的朋友參考下
    2013-04-04
  • 利用ascii碼傳輸xml轉(zhuǎn)義字符示例

    利用ascii碼傳輸xml轉(zhuǎn)義字符示例

    這篇文章主要介紹了利用ascii碼傳輸xml轉(zhuǎn)義字符示例,需要的朋友可以參考下
    2014-05-05

最新評(píng)論

麻江县| 湟中县| 伊川县| 旅游| 惠安县| 丹阳市| 连江县| 沁源县| 自贡市| 宿迁市| 大埔县| 常宁市| 和政县| 石首市| 敖汉旗| 高青县| 扎兰屯市| 章丘市| 宜都市| 会理县| 乌什县| 桐乡市| 景宁| 昆山市| 蓬莱市| 额济纳旗| 舞钢市| 龙山县| 阳春市| 宣威市| 兴安县| 商城县| 齐河县| 九寨沟县| 金门县| 清苑县| 阿尔山市| 石棉县| 开原市| 阳朔县| 宁夏|