2012-10-21 50 views
0

Java中的SQL注入可能:是使用Java的PreparedStatement和MySQL的存儲程序

PreparedStatement stmt = myConnection.prepareStatement("CALL myStoredRoutine(?, ?, ?)"); 
stmt.setString(1, a); 
stmt.setString(2, b); 
stmt.setString(3, c); 
stmt.executeQuery(); 

如果我的存儲例程是MySQL是有可能未過濾字符串中注入什麼東西進入我的代碼?

+0

基本上沒有。但是如果你的存儲過程構建了一個動態的sql語句並執行它,它可能變成一個可能的SQL注入。 –

+0

可以說你有這個查詢'SELECT * FROM userTable WHERE userName =?'。如果你正在使用'preparedStatement',它將直接發送到編譯它的數據庫,然後''setString()'方法中的'userName'將被替換。如果它發現一個非法值,它會導致異常被拋出。像''或'1'='1'這樣的'userName'將被視爲整個字符串,而不是像'or'和'='這樣的涉及運算符的語句。因此,這是安全的。 – Lion

回答

2

不,因爲PreparedStatement的構建是爲了防範SQL Injection

我看到你在調用存儲過程,所以最好使用CallableStatement。的PreparedStatement的

String SQL = "{CALL myStoredRoutine(?, ?, ?)}"; 
CallableStatement cstmt = myConnection.prepareCall(SQL); 
  • 預處理語句

實例包含已編譯的SQL語句。這是什麼使得語句「準備好」

因爲PreparedStatement對象是預編譯的,所以它們的執行速度可能比Statement對象快。

準備語句是用於執行SQL查詢

  • 調用語句

CallableStatement對象提供了一種方法來調用的所有RDBMS的標準方式存儲過程。存儲過程存儲在數據庫中;對存儲過程的調用是CallableStatement對象包含的內容。

1

不,這是不可能的。字符串通過準備語句進行過濾。實際上,這是他們的觀點之一。

0

不可以。參數綁定的目的是將參數解析爲參數。這對性能也有好處。

0

當您使用參數化查詢時,如果需要,參數將被解析並轉換爲轉義字符,因此無法實現。這是使用參數化查詢/準備語句的優勢。

相關問題