1. 程式人生 > >防止SQL注入攻擊的一些方法小結

防止SQL注入攻擊的一些方法小結

開頭語:SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施

-----解決方案--------------------------------------------------------
過濾URL中的一些特殊字元,動態SQL語句使用PrepareStatement..
------解決方案--------------------------------------------------------
注入的方式就是在查詢條件里加入SQL字串. 可以檢查一下提交的查詢引數裡是否包含SQL,但通常這樣無益.

最好的辦法是不要用拼接SQL字串,可以用prepareStatement,引數用set方法進行填裝
------解決方案--------------------------------------------------------
sql注入形式:...where name="+name+",這樣的sql語句很容易sql注入,可以這樣:
jdbcTemplate.update("delete from userinfo where id=? and userId=?", new Object[]{userInfo.getId(),userInfo.getUserId()});
我的一些程式碼,望有用!
------解決方案--------------------------------------------------------
Sql注入漏洞攻擊:如1'or'1'='1
使用引數化查詢避免
cmd.CommandText="select count(*) from 表名 where

[email protected] and [email protected]";
cmd.parameters.Add(new SqlParameter("a",".."));
cmd.parameters.Add(new SqlParameter("b",".."));
------解決方案--------------------------------------------------------
恩,用框架,用jpa的pojo。。就沒這種事情了

SSH2架構中 怎麼防止SQL注入呢?還有其他相關安全問題怎麼設計呢?
目前的安全,只是對使用者密碼加密,前臺jquery驗證。
如何實現防止注入攻擊還有我的頁面有些隱藏域儲存這當前登入使用者的資訊等資訊。
使用者檢視頁面原始碼就可以檢視到了。
有沒好的解決方案呢?還有其他哪些要注意的地方呢?
Struts2 hibernate3 spring 3.0
sql server 2000 sp4


------解決方案--------------------------------------------------------
1:向 CA 購買證書,使用 HTTPS 進行通訊,以保證在網路傳輸過程中是安全的
2:避免 XSS 注入(頁面回顯的 input text, input hidden 均過濾 <、>、"、' 等字元等)
3:使用隨機鍵盤或者安全控制元件防止鍵盤木馬記錄使用者的輸入
4:若要在 Cookie 中寫入資料,儘量使用 Cookie 的 HttpOnly 屬性
5:響應中設定一些諸如 X-Frame-Options、X-XSS-Protection 等高版本瀏覽器支援的 HTTP 頭
6: 不管客戶端是否做過資料校驗,在服務端必須要有資料校驗(長度、格式、是否必填等等)
7: SQL 語句採用 PreparedStatement 的填充引數方式,嚴禁使用字串拼接 SQL 或者 HQL 語句

六個建議防止SQL注入式攻擊
2009-04-01 14:38
SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。
  一、 SQL注入攻擊的簡單示例。
  statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
  上面這條語句是很普通的一條SQL語句,他主要實現的功能就是讓使用者輸入一個員工編號然後查詢處這個員工的資訊。但是若這條語句被不法攻擊者改裝過後,就可能成為破壞資料的黑手。如攻擊者在輸入變數的時候,輸入以下內容SA001’;drop table c_order--。那麼以上這條SQL語句在執行的時候就變為了SELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
  這條語句是什麼意思呢?‘SA001’後面的分號表示一個查詢的結束和另一條語句的開始。c_order後面的雙連字元 指示當前行餘下的部分只是一個註釋,應該忽略。如果修改後的程式碼語法正確,則伺服器將執行該程式碼。系統在處理這條語句時,將首先執行查詢語句,查到使用者編號為SA001 的使用者資訊。然後,資料將刪除表C_ORDER(如果沒有其他主鍵等相關約束,則刪除操作就會成功)。只要注入的SQL程式碼語法正確,便無法採用程式設計方式來檢測篡改。因此,必須驗證所有使用者輸入,並仔細檢查在您所用的伺服器中執行構造 SQL命令的程式碼。
  二、 SQL注入攻擊原理。
  可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施。
  SQL注入是目前比較常見的針對資料庫的一種攻擊方式。在這種攻擊方式中,攻擊者會將一些惡意程式碼插入到字串中。然後會通過各種手段將該字串傳遞到SQLServer資料庫的例項中進行分析和執行。只要這個惡意程式碼符合SQL語句的規則,則在程式碼編譯與執行的時候,就不會被系統所發現。
  SQL注入式攻擊的主要形式有兩種。一是直接將程式碼插入到與SQL命令串聯在一起並使得其以執行的使用者輸入變數。上面筆者舉的例子就是採用了這種方法。由於其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意程式碼注入要在表中儲存或者作為原書據儲存的字串。在儲存的字串中會連線到一個動態的SQL命令中,以執行一些惡意的SQL程式碼。
  注入過程的工作方式是提前終止文字字串,然後追加一個新的命令。如以直接注入式攻擊為例。就是在使用者輸入變數的時候,先用一個分號結束當前的語句。然後再插入一個惡意SQL語句即可。由於插入的命令可能在執行前追加其他字串,因此攻擊者常常用註釋標記“—”來終止注入的字串。執行時,系統會認為此後語句位註釋,故後續的文字將被忽略,不背編譯與執行。
  三、 SQL注入式攻擊的防治。


既然SQL注入式攻擊的危害這麼大,那麼該如何來防治呢?下面這些建議或許對資料庫管理員防治SQL注入式攻擊有一定的幫助。
  1、 普通使用者與系統管理員使用者的許可權要有嚴格的區分。
  如果一個普通使用者在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關係到資料庫的基本物件,故要操作這個語句使用者必須有相關的許可權。在許可權設計中,對於終端使用者,即應用軟體的使用者,沒有必要給他們資料庫物件的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意程式碼,由於其使用者許可權的限制,這些程式碼也將無法被執行。故應用程式在設計的時候,最好把系統管理員的使用者與普通使用者區分開來。如此可以最大限度的減少注入式攻擊對資料庫帶來的危害。
  2、 強迫使用引數化語句。
  如果在編寫SQL語句的時候,使用者輸入的變數不是直接嵌入到SQL語句。而是通過引數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,使用者的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,使用者的輸入的內容必須進行過濾,或者使用引數化的語句來傳遞使用者輸入的變數。引數化的語句使用引數而不是將使用者輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支援引數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要儘量採用引數化語句。
3、 加強對使用者輸入的驗證。
  總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對使用者輸入內容的檢查與驗證;二是強迫使用引數化語句來傳遞使用者輸入的內容。在SQLServer資料庫中,有比較多的使用者輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字串變數的內容,只接受所需的值。拒絕包含二進位制資料、轉義序列和註釋字元的輸入內容。這有助於防止指令碼注入,防止某些緩衝區溢位攻擊。測試使用者輸入內容的大小和資料型別,強制執行適當的限制與轉換。這即有助於防止有意造成的緩衝區溢位,對於防治注入式攻擊有比較明顯的效果。
  如可以使用儲存過程來驗證使用者的輸入。利用儲存過程可以實現對使用者輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意程式碼中,只要儲存過程把那個分號過濾掉,那麼這個惡意程式碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的儲存過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如註釋分隔符。註釋只有在資料設計的時候用的到。一般使用者的查詢語句中沒有必要註釋的內容,故可以直接把他拒絕掉,通常情況下這麼做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意程式碼,他們也將毫無作為。
  故始終通過測試型別、長度、格式和範圍來驗證使用者輸入,過濾使用者輸入的內容。這是防止SQL注入式攻擊的常見並且行之有效的措施。
  4、 多多使用SQL Server資料庫自帶的安全引數。
  為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL引數。在資料庫設計過程中,工程師要儘量採用這些引數來杜絕惡意的SQL注入式攻擊。
  如在SQL Server資料庫中提供了Parameters集合。這個集合提供了型別檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則使用者輸入的內容將被視為字元值而不是可執行程式碼。即使使用者輸入的內容中含有可執行程式碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行型別和長度檢查,範圍以外的值將觸發異常。如果使用者輸入的值不符合指定的型別與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的資料型別為字串型,長度為10個字元。而使用者輸入的內容雖然也是字元型別的資料,但是其長度達到了20個字元。則此時就會引發異常,因為使用者輸入的內容長度超過了資料庫欄位長度的限制。
  5、 多層環境如何防治SQL注入式攻擊?
  在多層應用環境中,使用者輸入的所有資料都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的資料應被資料庫拒絕,並向上一層返回一個錯誤資訊。實現多層驗證。對無目的的惡意使用者採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在使用者介面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程式中驗證資料可以防止簡單的指令碼注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意使用者就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。

相關推薦

Hibernate防止SQL注入攻擊方法

如果在查詢欄位中輸入單引號"'",則會報錯,這是因為輸入的單引號和其他的sql組合在一起程式設計了一個新的sql,實際上這就是SQL注入漏洞,後來我在前臺和後臺都對輸入的字元進行了判斷。 永遠也不要寫這樣的程式碼:      String queryString = "f

防止SQL注入攻擊一些方法小結

開頭語:SQL注入攻擊的危害性很大。在講解其防止辦法之前,資料庫管理員有必要先了解一下其攻擊的原理。這有利於管理員採取有針對性的防治措施 -----解決方案-------------------------------------------------------- 過濾

MyBatis 防止 % _ sql 注入攻擊 解決方法

首先說思路,在mybatis中防止sql注入,目前只能在Controller層進行轉義,後臺sql進行查詢,然後在controller層轉義回來,返回到前臺。 理論上應該可以在dao.xml中進行判斷   但是目前還沒寫出來。Orz 上程式碼 @RequiresPer

sql注入攻擊和PreparedStatement有效防止sql注入攻擊

【1】sql注入攻擊: /** * SQL 注入. */ @Test public void testSQLInjection() { String username = "a' OR PASSWORD = "; String password = " OR '1'='1

網站漏洞修復方案防止SQL注入攻擊漏洞

SQL注入漏洞在網站漏洞裡面屬於高危漏洞,排列在前三,受影響範圍較廣,像asp、.net、PHP、java、等程式語言編寫的程式碼,都存在著sql注入漏洞,那麼如何檢測網站存在sql注入漏洞?SQL注入漏洞測試方法在程式程式碼裡不管是get提交,post提交,cookies的

Mybatis防止SQL注入攻擊

相比於ORM框架,Mybatis只能被稱為半自動持久層框架,它其實是將JDBC進行了輕量級的封裝,提供SQL對映能力,便於更為方便地管理專案中的SQL程式碼,同時避免程式設計師重複手動編寫連線資料庫底層程式碼,並提供資料快取能力。 JDBC在使用時存在SQL注

php中防止SQL注入的最好方法是什麼?

如果使用者輸入的是直接插入到一個SQL語句中的查詢,應用程式會很容易受到SQL注入,例如下面的例子: $unsafe_variable = $_POST['user_input']; mysql_query("INSERT INTO table (column) VAL

如何防止SQL注入攻擊

    SQL注入攻擊的危害性很大,在講解其防止方法之前,資料庫管理員有必要想了解一下其攻擊的原理,這有利於管理員採取有針對性的防治措施。     一、SQL注入攻擊的簡單示例     statement:="select * from users where value=

文字框輸入防止sql注入攻擊

對文字框輸入文字進行校驗禁止輸入%和<等: <input class="easyui-textbox" data-options="validType:['length[0,30]','

PHP防止被xss和sql語句注入攻擊方法(網站和app通用)

傳過來的引數 如果是整數型別 那就直接用intval函式轉化為整數 字串 那就要用函數了 注意輸入的內容htmlspecialchars過濾程式碼如下 // Anti_SQL Injection, escape quotes function filter($content

PHP實現防止SQL注入的2種方法

PHP簡單實現防止SQL注入的方法,結合例項形式分析了PHP防止SQL注入的常用操作技巧與注意事項,PHP原始碼備有詳盡註釋便於理解,需要的朋友可以參考下!   方法一:execute代入引數 $var_Value) { //獲取POST陣列最大值 $num = $nu

html轉譯及防止js指令碼注入攻擊方法

js指令碼攻擊 有的時候頁面中會有一個輸入框,使用者輸入內容後會顯示在頁面中,類似於網頁聊天應用,留言板等。如果使用者輸入了一段js指令碼,比例:,頁面會彈出一個對話方塊,或者輸入的指令碼中有改變頁面js變數的程式碼則會時程式異常或者達到跳過某種驗證的目的。那如何防止這種惡意的js指令碼

PHP使用PDO簡單實現防止SQL注入方法

方法一:execute代入引數  <?php if(count($_POST)!= 0) { $host = 'aaa'; $database = 'bbb'; $username = 'ccc'; $password = '***'; $num

轉:PHP中防止SQL注入方法

【一、在伺服器端配置】        安全,PHP程式碼編寫是一方面,PHP的配置更是非常關鍵。 我們php手手工安裝的,php的預設配置檔案在 /usr/local/apache2/conf/php.ini,我們最主要

java防止SQL注入的兩種方法

1.採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setString方法傳值即可: String sql= "select * from users where username=? and password=?; PreparedStatement

Python中防止sql注入方法詳解

SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師程式設計時的疏忽,通過SQL語句,實現無帳號登入,甚至篡改資料庫。下面這篇文章主要給大家介紹了關於Python中防止sql注入的方法,需要的朋友可以參考下。   前言 大家

如何防止網站被SQL注入攻擊

首先我們應該對網站程式程式碼進行詳細的安全檢測,與網站漏洞檢測,在網站的前端進行多種方式的提交與注入檢測,對程式碼裡中與使用者互動並與資料庫直接傳輸打交道的程式碼進行嚴查,看看是否可以摻雜非法的sql注入程式碼進去。對GET、POST、COOKIES的提交進行過濾,過濾特殊符號,對一些&*%¥#@/等

jdbc防止sql注入方法總結

參考:http://hi.baidu.com/wangyue06/item/c00c824b35cf740ae835049c 1.傳統JDBC,採用PreparedStatement 。預編譯語句集,內建了處理SQL注入的能力 String sql= "selec

淺析php過濾html字串,防止SQL注入方法

本篇文章是對php中過濾html字串,防止SQL注入的方法進行了詳細的分析介紹,需要的朋友參考下   批量過濾post,get敏感資料 複製程式碼 程式碼如下: $_GET = stripslashes_array($_GET); $_POST = st

asp.net 360通用防護程式碼,防止sql注入與xss跨站漏洞攻擊

這是360提供的一個aspx公用程式碼,可以防止sql注入漏洞,xss跨站攻擊漏洞,如果您的網站被360掃描,出現sql注入或跨站攻擊等相關漏洞,沒有較好的解決方案,倒是可以採用該方法進下防範。 -----------------使用方法------------