2016-08-26 87 views
0

在我的應用程序中,我使用了一個XML Web服務,它允許我根據WHERE子句查詢數據。我想實現搜索功能,用戶輸入應該進入WHERE子句。該請求是這樣的:如何在沒有PreparedStatements的情況下避免SQL注入

<Query> 
    <Selection> 
     <sqlwhere> 
      id IN (
       SELECT something 
       FROM some_table 
       WHERE something_different LIKE '%<user input>%' 
       ESCAPE '\' 
      ) 
     </sqlwhere> 
    </Selection> 
</Query> 

服務包裝此部分爲實際的SELECT聲明。該服務可能使用Firebird或MS SQL Server數據庫。

我該如何輕鬆地逃避用戶輸入?足以逃避撇號嗎?

更新

也許我是有點不清楚。上面的部分發送給服務,服務以XML格式發送匹配的數據。我是而不是服務維護者。這意味着我不知道底層數據庫,因此無法連接到它來準備語句。

由於性能問題,我也無法獲取所有數據並在我的代碼中對其進行過濾。這是我可以有效地與之交談的唯一方式。

+2

爲什麼人們仍然試圖想出自己的方式來防止sql注入?堅持基於參數的查詢標準。 – Takarii

+0

@Takarii你甚至讀過這個問題嗎? – stevecross

+2

我做過了,但我仍不明白爲什麼要這樣做。如果輸入沒有被消毒,那麼它仍然存在風險 – Takarii

回答

0

使用來自服務的where子句構建您的查詢。請注意,我將'%<用戶輸入>%'替換爲'%?%'

<Query> 
    <Selection> 
    <sqlwhere> 
     id IN (
     SELECT something 
     FROM some_table 
     WHERE something_different LIKE '%?%' 
     ESCAPE '\' 
     ) 
    </sqlwhere> 
    </Selection> 
</Query> 

然後,使用PreparedStatement使用此SQL並根據用戶的輸入設置參數。

String sqlQuery = extractSQLFromService();//get the query and where clause here 
PreparedStatement ps = connection.prepareStatment(sqlQuery); 
ps.setString(1, userInput); 
ps.execute(); 

希望這有助於!

+0

不是''部分實際數據?這不會有效地提供'?'作爲價值嗎? – Takarii

+0

我沒有連接到數據庫,我不知道服務如何使用我提交的WHERE條款。 – stevecross

+0

我以爲你正在使用xml服務,所以你將使用這個XML的** < sqlwhere > **值來編寫你的查詢。 – anacron

相關問題