SQL注入漏洞解决方法
生活随笔
收集整理的這篇文章主要介紹了
SQL注入漏洞解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文只指針編碼層次的SQL注入漏洞解決方法,例子代碼是以java為主。
1,參數化的預編譯查詢語句
不安全例子
String query = "SELECT account_balance FROM user_data WHERE user_name = "+ request.getParameter("customerName");try {Statement statement = connection.createStatement( … );ResultSet results = statement.executeQuery( query );}防止通過參數傳不安全值,必須使用參數化的預編譯查詢語句
String custname = request.getParameter("customerName"); // This should REALLY be validated too// perform input validation to detect attacksString query = "SELECT account_balance FROM user_data WHERE user_name = ? ";PreparedStatement pstmt = connection.prepareStatement( query );pstmt.setString( 1, custname); ResultSet results = pstmt.executeQuery( );?2,輸入參數驗證白名單
不建議將SQL語句關鍵部分作參數傳遞,如表名、字段名或排序符(ASC、DESC)等。建議設計通過標識來判斷,如以下例子
String tableName;switch(PARAM):case "Value1": tableName = "fooTable";break;case "Value2": tableName = "barTable";break;...default : throw new InputValidationException("unexpected value provided for table name");用戶輸入可以轉換為非String,如日期,數字,布爾值,枚舉類型等等,然后再附加到查詢中,或者用于選擇附加到查詢的值,這樣可以確保它是安全的。
public String someMethod(boolean sortOrder) {String SQLquery = "some SQL ... order by Salary " + (sortOrder ? "ASC" : "DESC");...?3,轉義所有用戶輸入
這種技術只能作為最后的手段,當上述手段都不可行時。因為這種方法與其他防御相比是虛弱的,輸入驗證可能是一個更好的選擇。我們不能保證在所有情況下都會阻止所有SQL注入。只推薦在舊系統中使用輸入參數驗證成本高時使轉義所有用戶輸入,新寫系統或重構系統當然使參數化的預編譯查詢語句和輸入參數驗證。每種數據庫的轉義大不相同,具體參考ESAPI are available here on OWASP。例子是ORACLE下轉義所有用戶輸入
Codec ORACLE_CODEC = new OracleCodec();String query = "SELECT user_id FROM user_data WHERE user_name = '" + ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("userID")) + "' and user_password = '"+ ESAPI.encoder().encodeForSQL( ORACLE_CODEC, req.getParameter("pwd")) +"'";4,其它方法
設置程序使用的數據庫帳號最少權限,或者使用不的帳號賦于它們對應的權限。
?
參與資料
SQL Injection Prevention Cheat Sheet
?
轉載于:https://www.cnblogs.com/birdstudio/p/6903857.html
總結
以上是生活随笔為你收集整理的SQL注入漏洞解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux基础知识part3
- 下一篇: 08-面向对象----