① 如何避免代碼中出現sql注入
普通用戶與系統管理員用戶的許可權要有嚴格的區分。
如果一個普通用戶在使用查詢語句中嵌入另一個Drop Table語句,那麼是否允許執行呢?由於Drop語句關繫到資料庫的基本對象,故要操作這個語句用戶必須有相關的許可權。在許可權設計中,對於終端用戶,即應用軟體的使用者,沒有必要給他們資料庫對象的建立、刪除等許可權。那麼即使在他們使用SQL語句中帶有嵌入式的惡意代碼,由於其用戶許可權的限制,這些代碼也將無法被執行。故應用程序在設計的時候,
強迫使用參數化語句。
如果在編寫SQL語句的時候,用戶輸入的變數不是直接嵌入到SQL語句。而是通過參數來傳遞這個變數的話,那麼就可以有效的防治SQL注入式攻擊。也就是說,用戶的輸入絕對不能夠直接被嵌入到SQL語句中。與此相反,用戶的輸入的內容必須進行過濾,或者使用參數化的語句來傳遞用戶輸入的變數。參數化的語句使用參數而不是將用戶輸入變數嵌入到SQL語句中。採用這種措施,可以杜絕大部分的SQL注入式攻擊。不過可惜的是,現在支持參數化語句的資料庫引擎並不多。不過資料庫工程師在開發產品的時候要盡量採用參數化語句。
多多使用SQL Server資料庫自帶的安全參數。
為了減少注入式攻擊對於SQL Server資料庫的不良影響,在SQLServer資料庫專門設計了相對安全的SQL參數。在資料庫設計過程中,工程師要盡量採用這些參數來杜絕惡意的SQL注入式攻擊。
如在SQL Server資料庫中提供了Parameters集合。這個集合提供了類型檢查和長度驗證的功能。如果管理員採用了Parameters這個集合的話,則用戶輸入的內容將被視為字元值而不是可執行代碼。即使用戶輸入的內容中含有可執行代碼,則資料庫也會過濾掉。因為此時資料庫只把它當作普通的字元來處理。使用Parameters集合的另外一個優點是可以強制執行類型和長度檢查,范圍以外的值將觸發異常。如果用戶輸入的值不符合指定的類型與長度約束,就會發生異常,並報告給管理員。如上面這個案例中,如果員工編號定義的數據類型為字元串型,長度為10個字元。而用戶輸入的內容雖然也是字元類型的數據,但是其長度達到了20個字元。則此時就會引發異常,因為用戶輸入的內容長度超過了資料庫欄位長度的限制。
加強對用戶輸入的驗證。
總體來說,防治SQL注入式攻擊可以採用兩種方法,一是加強對用戶輸入內容的檢查與驗證;二是強迫使用參數化語句來傳遞用戶輸入的內容。在SQLServer資料庫中,有比較多的用戶輸入內容驗證工具,可以幫助管理員來對付SQL注入式攻擊。測試字元串變數的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和注釋字元的輸入內容。這有助於防止腳本注入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治注入式攻擊有比較明顯的效果。
如可以使用存儲過程來驗證用戶的輸入。利用存儲過程可以實現對用戶輸入變數的過濾,如拒絕一些特殊的符號。如以上那個惡意代碼中,只要存儲過程把那個分號過濾掉,那麼這個惡意代碼也就沒有用武之地了。在執行SQL語句之前,可以通過資料庫的存儲過程,來拒絕接納一些特殊的符號。在不影響資料庫應用的前提下,應該讓資料庫拒絕包含以下字元的輸入。如分號分隔符,它是SQL注入式攻擊的主要幫凶。如注釋分隔符。注釋只有在數據設計的時候用的到。一般用戶的查詢語句中沒有必要注釋的內容,故可以直接把他拒絕掉,通常情況下這么做不會發生意外損失。把以上這些特殊符號拒絕掉,那麼即使在SQL語句中嵌入了惡意代碼,他們也將毫無作為。
多層環境如何防治SQL注入式攻擊?
在多層應用環境中,用戶輸入的所有數據都應該在驗證之後才能被允許進入到可信區域。未通過驗證過程的數據應被資料庫拒絕,並向上一層返回一個錯誤信息。實現多層驗證。對無目的的惡意用戶採取的預防措施,對堅定的攻擊者可能無效。更好的做法是在用戶界面和所有跨信任邊界的後續點上驗證輸入。如在客戶端應用程序中驗證數據可以防止簡單的腳本注入。但是,如果下一層認為其輸入已通過驗證,則任何可以繞過客戶端的惡意用戶就可以不受限制地訪問系統。故對於多層應用環境,在防止注入式攻擊的時候,需要各層一起努力,在客戶端與資料庫端都要採用相應的措施來防治SQL語句的注入式攻擊。
② 如何防止sql注入攻擊
1,避免將用戶提供的輸入直接放入SQL語句中,最好使用准備好的語句和參數化查詢,這樣更加安全。
2,不要將敏感數據保存在純文本中,加密存儲在資料庫中的私有或機密數據,這樣可以提供另一級保護,以防止攻擊者成功地排出敏感數據。
3,將資料庫用戶的功能設置為最低要求,這將限制攻擊者在設法獲取訪問許可權時可以執行的操作。
4,避免直接向用戶顯示資料庫錯誤,攻擊者可以使用這些錯誤消息來獲取有關資料庫的信息。
5,對訪問資料庫的Web應用程序使用防火牆,這樣可以為面向Web的應用程序提供保護,可以幫助識別SQL注入嘗試;根據設置,還可以幫助防止SQL注入嘗試到達應用程序。
6,定期測試與資料庫交互的Web應用程序,這樣做可以幫助捕獲可能允許SQL注入的新錯誤或回歸。
7,將資料庫更新為最新的可用修補程序,這可以防止攻擊者利用舊版本中存在的已知弱點或錯誤。
③ 如何防範SQL注入式攻擊
SQL注入攻擊的危害很大,而且防火牆很難對攻擊行為進行攔截,主要的SQL注入攻擊防範方法,具體有以下幾個方面。
1、分級管理
對用戶進行分級管理,嚴格控制用戶的許可權,對於普通用戶,禁止給予資料庫建立、刪除、修改等相關許可權,只有系統管理員才具有增、刪、改、查的許可權。
2、參數傳值
程序員在書寫SQL語言時,禁止將變數直接寫入到SQL語句,必須通過設置相應的參數來傳遞相關的變數。從而抑制SQL注入。數據輸入不能直接嵌入到查詢語句中。同時要過濾輸入的內容,過濾掉不安全的輸入數據。或者採用參數傳值的方式傳遞輸入變數,這樣可以最大程度防範SQL注入攻擊。
3、基礎過濾與二次過濾
SQL注入攻擊前,入侵者通過修改參數提交and等特殊字元,判斷是否存在漏洞,然後通過select、update等各種字元編寫SQL注入語句。因此防範SQL注入要對用戶輸入進行檢查,確保數據輸入的安全性,在具體檢查輸入或提交的變數時,對於單引號、雙引號、冒號等字元進行轉換或者過濾,從而有效防止SQL注入。
當然危險字元有很多,在獲取用戶輸入提交參數時,首先要進行基礎過濾,然後根據程序的功能及用戶輸入的可能性進行二次過濾,以確保系統的安全性。
4、使用安全參數
SQL資料庫為了有效抑制SQL注入攻擊的影響。在進行SQLServer資料庫設計時設置了專門的SQL安全參數。在程序編寫時應盡量使用安全參數來杜絕注入式攻擊,從而確保系統的安全性。
5、漏洞掃描
為了更有效地防範SQL注入攻擊,作為系統管理除了設置有效的防範措施,更應該及時發現系統存在SQL攻擊安全漏洞。系統管理員可以采購一些SQL漏洞掃描工具,通過專業的掃描工具,可以及時的掃描到系統存在的相應漏洞。
6、多層驗證
現在的網站系統功能越來越龐大復雜。為確保系統的安全,訪問者的數據輸入必須經過嚴格的驗證才能進入系統,驗證沒通過的輸入直接被拒絕訪問資料庫,並且向上層系統發出錯誤提示信息。同時在客戶端訪問程序中驗證訪問者的相關輸入信息,從而更有效的防止簡單的SQL注入。但是如果多層驗證中的下層如果驗證數據通過,那麼繞過客戶端的攻擊者就能夠隨意訪問系統。因此在進行多層驗證時,要每個層次相互配合,只有在客戶端和系統端都進行有效的驗證防護,才能更好地防範SQL注入攻擊。
7、資料庫信息加密
傳統的加解密方法大致分為三種:對稱加密、非對稱加密、不可逆加密。
④ sql注入如何防止
1、使用參數化篩選語句
為了防止SQL注入,用戶輸入不能直接嵌入到SQL語句中。相反,用戶輸入必須被過濾或參數化。參數語句使用參數,而不是將用戶輸入嵌入語句中。在大多數情況下,SQL語句是正確的。然後,用戶輸入僅限於一個參數。
一般來說,有兩種方法可以確保應用程序不易受到SQL注入攻擊。一種是使用代碼審查,另一種是強制使用參數化語句。強制使用參數化語句意味著在運行時將拒絕嵌入用戶輸入中的SQL語句。但是,目前對此功能的支持不多。
2、避免使用解釋程序,這是黑 客用來執行非法命令的手段。
3、防止SQL注入,但也避免一些詳細的錯誤消息,因為黑客可以使用這些消息。標準的輸入驗證機制用於驗證所有輸入數據的長度、類型、語句和企業規則。
4、使用漏洞掃描工具。
但是,防範SQL注入攻擊是不夠的。攻擊者現在自動搜索和攻擊目標。它的技術甚至可以很容易地應用於其他Web體系結構中的漏洞。企業應該投資於專業的漏洞掃描工具,如著名的Accunetix網路漏洞掃描程序。完美的漏洞掃描器不同於網路掃描器,它專門在網站上查找SQL注入漏洞。最新的漏洞掃描程序可以找到最新發現的漏洞。
5、最後,做好代碼審計和安全測試。
⑤ 什麼是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語句的注入式攻擊。
6、 必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點。
使用專業的漏洞掃描工具,可以幫助管理員來尋找可能被SQL注入式攻擊的點。不過漏洞掃描工具只能發現攻擊點,而不能夠主動起到防禦SQL注入攻擊的作用。當然這個工具也經常被攻擊者拿來使用。如攻擊者可以利用這個工具自動搜索攻擊目標並實施攻擊。為此在必要的情況下,企業應當投資於一些專業的漏洞掃描工具。一個完善的漏洞掃描程序不同於網路掃描程序,它專門查找資料庫中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發現的漏洞。所以憑借專業的工具,可以幫助管理員發現SQL注入式漏洞,並提醒管理員採取積極的措施來預防SQL注入式攻擊。如果攻擊者能夠發現的SQL注入式漏洞資料庫管理員都發現了並採取了積極的措施堵住漏洞,那麼攻擊者也就無從下手了。
⑥ 網站如何防止sql注入攻擊的解決辦法
首先我們來了解下什麼是SQL注入,SQL注入簡單來講就是將一些非法參數插入到網站資料庫中去,執行一些sql命令,比如查詢資料庫的賬號密碼,資料庫的版本,資料庫伺服器的IP等等的一些操作,sql注入是目前網站漏洞中危害最大的一個漏洞,受攻擊的網站佔大多數都是sql注入攻擊。
sql注入攻擊用英語來講Structured Query Language,在網站的編程語言當中是一種比較另類的網站開發語言,我們網站安全行業通常來講sql是用來資料庫查詢的一種網站開發語言,同時也是一種腳本文件的一個文件名,通俗來講sql就是用來對網站的資料庫進行查詢,以及增加,寫入,更新資料庫的一個sql資料庫操作。
關於資料庫我們分為2種資料庫,一種是關系資料庫,非關系資料庫,那麼目前網站使用的都是關系資料庫,關系資料庫分為sql資料庫,microsoft sql server資料庫,ACC資料庫,mysql資料庫,oracle資料庫,DB2資料庫,postgresql資料庫等等的關系資料庫,非關系資料庫分為nosql資料庫,可以存儲很大數據,針對於一些並發較高,存儲較多,雲計算的場景,頻繁讀取寫入的資料庫,像memcachedb,redis,mongodb等等非關系資料庫。
那麼什麼是sql注入呢? 簡單來講就是對網站強行進行插入數據,執行sql惡意語句對網站進行攻擊,對網站進行sql注入嘗試,可以獲取一些私密的信息,像資料庫的版本,管理員的賬號密碼等等。
關於如何防止sql注入攻擊,我們從以下幾點開始入手
首先我們可以了解到sql注入攻擊都是通過拼接的方式,把一些惡意的參數拼接到一起,然後在網站的前端中插入,並執行到伺服器後端到資料庫中去,通常我們在寫PHP網站代碼的時候會將get ID這個參數值獲取到後直接拼接到後端伺服器中去,查詢資料庫,但是如果拼接了一些惡意的非法參數,那麼久可以當做sql語句來執行,如果防止sql注入呢?
為了防止網站被sql注入攻擊,我們應該從一開始寫代碼的時候就應該過濾一些sql注入的非法參數,將查詢的一些sql語句,以及用戶輸入的參數值都以字元串的方式來處理,不論用戶輸入的什麼東西,在sql查詢的時候只是一段字元串,這樣構造的任何惡意參數都會以字元串的方式去查詢資料庫,一直惡意的sql注入攻擊就不會被執行,sql注入語句也就沒有效果了,再一個就是網站里的任何一個可以寫入的地方盡可能的嚴格過濾與限制,漏下一個可以輸入的地方網站就會被攻擊,網站就會被黑,所有做的網站安全就會沒有效果,包括一些get,post,cookie方式的提交都是不可信的,像數據表裡referer user-agent等欄位都是可以偽造,寫入sql注入語句的,像前端時間爆發的ecshop漏洞利用的就是user.php,偽造referer參數進行了sql注入,執行了遠程代碼。
再一個防止sql注入的方法就是開啟PHP的魔術配置,開啟安全配置模式,將safe_mode開啟on.以及關閉全局變數模式,register_globals參數設置為on,magic_quotes_gpc參數開啟,防止sql注入.如果對網站防止sql注入不懂的話,也可以找專業的網站安全公司來做安全,防止sql注入。
⑦ 怎麼防SQL注入攻擊
在conn.asp或其他網頁前面加上如下防注入代碼即可。
<%
dim var
var = "and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|or|javascript"
sql_inj = split(var,"|")
If Request.QueryString<>"" Then
For Each sql_Get In Request.QueryString
For sql_Data=0 To Ubound(sql_inj)
if instr(Request.QueryString(sql_Get),sql_inj(sql_Data))>0 Then
Response.Write "<Script Language=Javascript>alert('該程序執行了非法操作,即將被關閉');window.close();</Script>"
Response.end
end if
next
Next
End If
%>
⑧ 什麼是sql注入如何防止sql注入
SQL注入是一種非常常見的資料庫攻擊手段,同時也是網路世界中最普遍的漏洞之一,簡單理解就是惡意用戶通過在表單中填寫包含SQL關鍵字的數據來使資料庫執行非常規代碼的過程。
問題來源是,SQL資料庫的操作是通過SQL語句來執行的,而無論是執行代碼還是數據項都必須寫在SQL語句中,也就導致如果我們在數據項中加入了某些SQL語句關鍵字,比如SELECT、DROP等,這些關鍵字就很有可能在資料庫寫入或讀取數據時得到執行。
解決方案
方案一:
採用預編譯技術
使用預編譯的SQL語句,SQL語句的語義不會是不會發生改變的。預編譯語句在創建的時候就已經將指定的SQL語句發送給了DBMS,完成了解析,檢查,編譯等工作,所以攻擊者無法改變SQL語句的結構,只是把值賦給?,然後將?這個變數傳給SQL語句。當然還有一些通過預編譯繞過某些安全防護的操作,大家感興趣可以去搜索一下。
方案二:
嚴格控制數據類型
在java、c等強類型語言中一般是不存在數字型注入的,因為在接受到用戶輸入id時,代碼一般會做一個int id 的數據類型轉換,假如我們輸入的是字元串的話,那麼這種情況下,程序就會報錯。但是在PHP、ASP這些沒有強調處理數據類型的語言,一般我們看到的接收id的代碼都是如下等代碼。
方案三:
對特殊的字元進行轉義
數字型注入可以通過檢查數據類型防止,但是字元型不可以,那麼怎麼辦呢,最好的辦法就是對特殊的字元進行轉義了。比如在MySQL中我們可以對" '
"進行轉義,這樣就防止了一些惡意攻擊者來閉合語句。當然我們也可以通過一些安全函數來轉義特殊字元。如addslashes()等,但是這些函數並非一勞永逸,攻擊者還可以通過一些特殊的方式繞過。
⑨ 怎樣利用instr()函數防止SQL注入攻擊
privatevoidbutton1_Click(objectsender,EventArgse)
{
//實例化資料庫連接對象
SqlConnectionsqlcon=newSqlConnection("DataSource=(local);Database=Northwind;Uid=sa;Pwd=;");
//實例化資料庫橋接器對象
SqlDataAdaptersqlda=newSqlDataAdapter("selectLastName,=@lastnameandFirstName=@firstname",sqlcon);
//為SQL語句中的參數賦值
sqlda.SelectCommand.Parameters.Add("@lastname",SqlDbType.NVarChar,20).Value=textBox1.Text;
sqlda.SelectCommand.Parameters.Add("@firstname",SqlDbType.NVarChar,10).Value=textBox2.Text;
DataSetmyds=newDataSet();//實例化DataSet數據集對象
sqlda.Fill(myds);//填充數據集
if(myds.Tables[0].Rows.Count>0)//判斷數據集中的表中是否有行
MessageBox.Show("用戶登錄成功!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
else
{
MessageBox.Show("用戶登錄失敗,原因為:用戶名或密碼錯誤!","錯誤",MessageBoxButtons.OK,MessageBoxIcon.Error);
textBox1.Text=textBox2.Text="";//清空文本框
textBox1.Focus();//為用戶姓名文本框設置輸入焦點
}
}