成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

預防SQL注入攻擊之我見

數據庫
說起防止SQL注入攻擊,感覺很郁悶,這么多年了大家一直在討論,也一直在爭論,可是到了現在似乎還是沒有定論。

1、 SQL注入攻擊的本質:讓客戶端傳遞過去的字符串變成SQL語句,而且能夠被執行。

2、 每個程序員都必須肩負起防止SQL注入攻擊的責任。

說起防止SQL注入攻擊,感覺很郁悶,這么多年了大家一直在討論,也一直在爭論,可是到了現在似乎還是沒有定論。當不知道注入原理的時候會覺得很神奇,怎么就被注入了呢?會覺得很難預防。但是當知道了注入原理之后預防不就是很簡單的事情了嗎?

第一次聽說SQL注入攻擊的時候還是在2004年(好像得知的比較晚),那是還是在寫asp呢。在一次寫代碼的時候,有同事問我,你的這段代碼防注入攻擊了嗎?什么攻擊?這是什么呀。

后來到網上各種找,終于弄明白了是怎么攻擊進來的了。注入攻擊都是來自于客戶端,無論是表單提交、URL傳值還是Cookie等,其實原理都是一樣的。到了服務器端可以分成三種情況:數字、日期時間、字符串。

一、數字。

如何注入?

假設我們要實現一個顯示新聞的頁面,我們可能會隨手寫下下面的代碼:

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

如果傳遞過來的 id是我們想像的 數字(比如168),那么自然不會有什么問題。但是如果傳遞過來的id是“168 delete from table ”的話,那么sql的值就變成了“select * from table where ColID=168 delete from news”。對于SQL Server來說是支持一次提交多條SQL語句的,這個為我們提供了方便之余也為SQL注入敞開了大門。顯然如果這條SQL語句被執行的話,那么news表里的記錄就都沒有了。

那么如何預防呢?很簡單,因為ColID字段的類型是int的,那么我們只需要驗證一下傳遞過來的id是不是整數就可以了。是整數就不存在注入;如果不是那么就有可能存在注入。即使不存在注入,把一個不是整數的id拼接進去也會造成執行錯誤。

所以說不管是不是為了預防SQL注入,也都應該驗證id是不是整數。

驗證方法嘛,可以用TryParse,可以用正則,也可以自己寫函數驗證。但是不建議用try異常的方式,因為這個有效率問題。

這里還有一個特殊情況,就是對于批量刪除這類的會傳遞過來多個數字,比如“1,2,3,10”,這個也需要驗證一下,萬一有人利用這個漏洞呢。至于驗證方法也很簡單,自己寫個函數就ok了。

二、日期時間

這個和數字的情況是一樣的,驗證是不是日期時間即可。

三、字符串

最麻煩、爭議最大的就是這個了。

先看一下如何注入

比如我們先要按照新聞標題來進行查詢,可能寫的代碼:

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

這個又是如何注入的呢?我想先問大家一個問題:如果key的值永遠都不會包含單引號,那么會不會被注入進來?

那么用了單引號又是如何注入的呢?假設key=" ' delete from news --" ,那么sql的值就是“ select * from news where title like '%' delete from news -- ' ”。

先用一個單引號和前面的單引號組成一對封閉的單引號,這一對單引號內部('%')就作為字符串處理,而外面的就被作為SQL語句處理,而第二個單引號被 “--”給注釋掉了,這樣就保證了整個sql語句的正確性。

這是注入的一種方法。

那么如何來防止呢?想想剛才的問題,如果沒有單引號是不是就天下太平了呢?對于這種情況(前面的“數字”的情況不算),到目前為止我是沒發現不用單引號,還能夠注入進來的方法。也許是我孤陋寡聞吧,不知道各位高手是否知道對于這種情況,不用單引號還能注入進來的方法。

既然找到了罪魁禍首,那么就好辦了,把單引號干掉就ok了。key = key.Replace("'", "''");這時候sql的值就是” select * from news where title like '%'' delete from news --'”。

對于SQL 來說在一對單引號內部的兩個單引號表示一個字符串形式的單引號。這樣我們就把罪魁禍首改造成了字符串了。在一對單引號內的“--”也是普通的字符串而不代表注釋。

罪魁禍首是單引號,想不明白為什么有許多人都去過濾 “delete、update”這一類的關鍵字,他們都是安善良民呀,他們是很冤枉的。當然了,如果前提是程序都已經寫好了,不能修改內部代碼,那就另當別論了。至于“--”頂多算是幫兇,如果您不放心的話,把他處理了也行。

總結:數字、日期時間的,驗證類型;字符串的,處理好單引號。

另外為了安全起見,不要用sa連接數據庫,xp_cmdshell這一類的有危險的擴展存儲過程也應該處理一下(比如刪除)。

ps:添加修改數據的時候可以用參數化的SQL語句,但是目的不是防止注入,而是重用執行計劃。

還有就是js腳本的問題,這個還沒有仔細考慮,可以用html編碼的方式,也可以用替換的方式,還有ubb的漏洞等。

原文鏈接:http://www.cnblogs.com/jyk/archive/2009/11/26/1610987.html

【編輯推薦】

  1. NoSQL數據庫漸入佳境 國內應用案例盤點
  2. 記一次成功的SQL注入入侵檢測附帶SQL性能優化
  3. 數據庫遷移之何去何從
  4. 教你五步優化你的MongoDB
  5. 數據庫緩存重建不容忽視
責任編輯:艾婧 來源: 金色海洋工作室
相關推薦

2009-09-23 10:43:22

2010-09-14 16:28:52

2010-09-14 16:00:16

2014-11-04 13:43:10

2020-08-07 08:13:08

SQL攻擊模式

2019-02-22 09:00:00

2009-02-04 16:51:48

2024-08-26 15:31:55

2009-03-10 08:05:19

2011-07-12 10:38:10

2012-11-08 17:02:58

2021-01-11 09:52:03

JavaSQL框架

2010-09-16 21:20:02

2022-02-14 17:13:46

攻擊面管理網絡安全

2013-04-26 11:26:00

2012-04-12 15:06:44

2010-09-30 12:53:10

2010-09-08 13:31:24

2009-08-13 17:25:16

2021-10-03 15:50:06

網絡釣魚病毒黑客
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产亚洲精品a | av在线亚洲天堂 | 91一区二区 | 九色网址| 国产日韩欧美电影 | 日本特黄a级高清免费大片 特黄色一级毛片 | 国产日产欧产精品精品推荐蛮挑 | 欧美片网站免费 | 久久这里只有精品首页 | 美国av毛片 | 国产高清在线精品 | 97伦理最新伦理 | 亚洲欧美中文字幕在线观看 | 中文字幕 视频一区 | 久久久黄色 | 日韩精品一区二区三区在线播放 | 国产精品久久久99 | 91在线综合 | 国产精品一区二区视频 | 国产午夜精品理论片a大结局 | 欧美一区二区三区在线看 | 91精品国产91久久久久久吃药 | 91av在线免费 | 人人九九精 | 久久久久久久久久久久久9999 | aaa级片| 国产69久久精品成人看动漫 | 午夜精品福利视频 | 国产美女在线观看 | 欧州一区二区三区 | 精品国产1区2区3区 在线国产视频 | 成人二区 | 成人福利在线 | 亚洲视频在线免费观看 | 欧美日韩国产精品一区二区 | 久久精品国产亚洲夜色av网站 | 人干人人 | 国产精品视频yy9299一区 | 日日干天天操 | 美女视频一区 | 免费观看的av |