關於防止SQL指令碼注入攻擊

2021-09-20 14:49:58 字數 2524 閱讀 7104

[摘自sql server 2005 聯機幫助]

sql injection 是一種攻擊方法,它可以將惡意**插入到以後將傳遞給 sql server 供分析和執行的字串中。任何構成 sql 語句的過程都應進行注入漏洞檢查,因為 sql server 將執行其接收到的所有語法有效的查詢。

sql injection 的主要形式包括直接將**插入與 sql 命令串聯並執行的使用者輸入變數。一種間接的攻擊會將惡意**注入要在表中儲存或作為元資料儲存的字串。在儲存的字串隨後串連到乙個動態 sql 命令中時,將執行該惡意**。

基本的攻擊是提前終止文字字串,然後追加乙個新的命令。由於插入的命令可能在執行前追加其他字串,因此攻擊者將用注釋標記「--」來中止注入的字串。執行時,此後的文字將被忽略。

以下指令碼闡釋了乙個簡單的 sql injection 攻擊。此指令碼通過串聯硬編碼字串和使用者輸入的字串而生成乙個 sql 查詢。

使用者將被提示輸入乙個城市名稱。如果使用者輸入 redmond,則查詢將由以下這樣的指令碼組成:

如果使用者輸入如下內容會怎樣呢?

redmond'; drop table orderstable--

此時,查詢將由如下所示的指令碼組成:

「;」字元表示乙個查詢的結束和另乙個查詢的開始。「--」字串行則表示當前行餘下的部分是乙個注釋,應該忽略。如果更改後的**語法正確 ,則伺服器將執行該**。

sql server 在處理此語句時,將首先選擇 orderstable 中的所有記錄(其中 shipcity 為 redmond),然後刪除 orderstable。

只要注入的 sql **語法正確,就無法用程式設計方式來檢測篡改。因此,必須驗證所有使用者輸入,並仔細檢查在伺服器中執行構造 sql 命令的**。下面討論了一些編寫**的最佳做法。

1、驗證所有輸入

始終通過測試型別、長度、格式和範圍來驗證使用者輸入。實現對惡意輸入的預防時,請注意應用程式的體系結構和部署方案。請記住,為在安全環境下執行而設計的程式可能被複製到不安全的環境中。

以下建議應被視為最佳做法:

對應用程式接收的資料不做任何有關大小、型別或內容的假設。例如,評估以下內容:

o 如果是乙個使用者在需要郵政編碼的位置無意中或惡意地輸入了乙個 10 mb 的 mpeg 檔案,應用程式會做出什麼反應?

o 如果在文字欄位中嵌入了乙個 drop table 語句,應用程式會做出什麼反應?

測試輸入的大小和資料型別,強制執行適當的限制。這有助於防止有意造成的緩衝區溢位。

測試字串變數的內容,只接受所需的值。拒絕包含二進位制資料、轉義序列和注釋字元的輸入內容。這有助於防止指令碼注入,防止某些緩衝區溢位攻擊。

使用 xml 文件時,根據資料的架構對輸入的所有資料進行驗證。

絕不直接使用使用者輸入內容來生成 transact-sql 語句。

使用儲存過程來驗證使用者輸入。

在多層環境中,所有資料都應該在驗證之後才允許進入可信區域。未通過驗證的資料應被拒絕,並向前一層返回乙個錯誤。

實現多層驗證。對無目的的惡意使用者採取的預防措施可能對專業黑客無效。最佳做法是在使用者介面驗證輸入,然後在所有跨信任邊界的後續點上驗證輸入。

例如,在客戶端應用程式中驗證資料可以防止簡單的指令碼注入;但是,如果下一層假設其輸入已被驗證,則任何可以跳過客戶端的黑客就可能不受限制地訪問系統。

絕不串聯未驗證的使用者輸入。字串串聯是指令碼注入的主要輸入點。

在可能據以構造檔名的字段中,不接受下列字串:aux、clock$、com1 到 com8、con、config$、lpt1 到 lpt8、nul 以及 prn。

如果可能,拒絕包含以下字元的輸入。

2、使用型別安全的 sql 引數

sql server 中的 parameters 集合提供了型別檢查和長度驗證。如果使用 parameters 集合,則輸入將被當成文字值而不是可執行**進行處理。使用 parameters 集合的另乙個好處是可以強制執行型別和長度檢查。

範圍以外的值將觸發異常。以下**片斷闡釋了如何使用 parameters 集合:

在上述示例中,@au_id 引數被當成文字值而不是可執行**進行處理。將對此值進行型別和長度檢查。如果 @au_id 值不符合指定的型別和長度約束,則將引發異常。

3、在儲存過程中使用引數化輸入

儲存過程如果使用未篩選的輸入,則可能容易受 sql injection 攻擊。例如,以下**容易受到攻擊:

如果使用儲存過程,則應使用引數作為儲存過程的輸入。

4、在動態 sql 中使用引數集合

如果不能使用儲存過程,您仍可使用引數,如下所示。

5、篩選輸入

篩選輸入可以刪除轉義符,這也可能有助於防止 sql 注入;但由於可引起問題的字元數量很大,因此這並不是一種可靠的防護方法。以下**片段可搜尋字串分隔符。

6、like 子句

請注意,如果要使用 like 子句,還需要對萬用字元字元進行轉義:

7、引數批處理

有一種常見的錯誤概念,即,當多個 sql 語句串聯起來向伺服器進行成批傳輸時,不能使用引數。事實上,只要引數名不重複,是可以使用引數的。保證每個名稱唯一性的方法很簡單,就是在 sql 文字串聯過程中,在每個引數名稱中新增乙個數字或其他唯一值。

關於sql的2019畢業設計開題報告

畢業設計 開題報告 學生姓名 李曉明學號 0807240220 專業 自動化 測控技術與儀器 設計 題目 基於mssql2008 的資料包表列印 服務設計與開發 指導教師 蔚偉 2012年 3 月 30 日 開題報告填寫要求 1 開題報告 含 文獻綜述 作為畢業設計 答辯委員會對學生答辯資格審查的依...

關於雷的作文今夜雷電雨注

摘要 太平洋的彼岸,炎炎的夏季,大氣的對流,形成了暖濕氣流的北上與南下北極冷空氣的交換,這種對流,補充了我眼前熱蒸發造成的低壓,我身在這個濕熱氣流途徑的區域,有梅雨 有熱帶風暴也就非常自然 電閃如晝,雷雨驚夢。咆哮聲滾過了漆黑的夜,震耳欲聾。雨仿偌從天堂傾盆而注,把我從夢中澆醒,濕漉漉的,不知去向何...

關於防止路面汙染破壞的通知

專案部所屬各單位 為加強路面質量管理,杜絕路面環境汙染,現要求專案部所屬各單位遵守如下要求 1 所屬各單位未施工完的段落,均應鋪設隔層,嚴禁直接在路面上拌和,堆碼材料,並對所施工完的段落清掃乾淨。發現一次,處以100元 次的罰款 不夠1 的按1 計算 2 砼 水泥砂漿等易造成滴 灑 漏的材料運輸 澆...