這是我的應用程序的查詢模塊中的一個關鍵字衝突問題,請看看您是否可以告訴我一個聰明的解決方案。SQL注入的智能解決方案
首先,在查詢模塊,每個查詢條件包含在UI三個部分:
1.field的名字,它的值是固定的,如產地,finalDest ...
2.operator,它是一個包含「like」,「not like」,「in」,「not in」,「=」,「!=」的選擇列表。
3.value,這部分是用戶輸入的,結束時,它將根據UI的查詢條件組裝SQL語句,例如,如果用戶在UI中鍵入/選擇以下內容:
Field Name Operator Value
origin like CHI
finalDest in SEL
在後端,它會生成以下SQL:
SELECT * FROM預訂原屬LIKE '%CHI%' 和finalDest在( 'SEL')。
但有一個bug,例如,如果用戶在「value」中鍵入某些特殊符號,例如「'」,「_」等,它將導致生成的SQL也包含'或_,例如:
從預訂中選擇*來源如'%C_HI%'和finalDest('S'EL')。
,你可以看到,因爲在「地方」塊時,SQL無法執行
對於這個問題的特殊符號,我的解決辦法是添加「/」中的特殊符號前面之前轉義字符執行它,但我知道只是'或_會與SQL關鍵字衝突,你知道是否有其他類似的符號需要處理嗎?或者你們有沒有更好的想法可以避免注入
對不起,忘了告訴你我在用什麼語言,我用的是java,DB是mysql,我也用hibernate,有很多人說爲什麼我沒有用PreparedStatement,這有點複雜,只是簡單speakin g,在我的公司中,我們有一個名爲動態查詢的FW,我們在一個XML文件中預先定義了SQL片段,然後我們將根據UI標準用jxel表達式組裝SQL片段,因爲SQL有點類似於預先定義的東西,我害怕如果改變使用PreparedStatement,它會涉及我們FW的很多變化,所以我們關心的只是如何用簡單的方法修復SQL注入問題。
想必您發送該查詢到服務器,服務器應具有唯一的客戶端可以訪問驗證方案,客戶端應該清理它的數據庫輸入。 – awiebe
您使用哪種服務器端語言? –
嗨,我使用mysql5 + hibernate,但我認爲它不應該依賴於mysql,並且應該是一個通用的跨平臺SQL語句 – Chailie