我正在公開一個或多或少的公共API,允許用戶從數據庫中查詢數據集。由於用戶需要過濾出特定的數據集,因此我試圖接受SELECT語句的WHERE部分作爲API參數。因此,用戶可以按照自己喜歡的方式執行復雜的查詢,而無需擔心混亂的API接口。在公共API中允許一些SQL?
我所知道的,我將不得不捕獲SQL注入嘗試的事實。
你認爲這會繞過一個API包裝數據庫的目的太多,否則你會認爲這是一個明智的做法?
我正在公開一個或多或少的公共API,允許用戶從數據庫中查詢數據集。由於用戶需要過濾出特定的數據集,因此我試圖接受SELECT語句的WHERE部分作爲API參數。因此,用戶可以按照自己喜歡的方式執行復雜的查詢,而無需擔心混亂的API接口。在公共API中允許一些SQL?
我所知道的,我將不得不捕獲SQL注入嘗試的事實。
你認爲這會繞過一個API包裝數據庫的目的太多,否則你會認爲這是一個明智的做法?
在一般情況下,我建議不要讓他們在他們的請求
嵌入實際的SQL你可以讓他們在他們的要求提交where
條件很容易:
<where>
<condition "field"="name" "operator"="equal" "value"="Fred"/>
</where>
或類似的東西。
這樣做的價值是木裏倍:
我認爲最後一點其實是最重要的。將需要對數據庫的基礎模式進行更改的那一天即將到來。最終,它會發生。此時,您會欣賞在用戶發送的內容和查詢之間有一些「翻譯」層。它將允許您將用戶與底層數據庫中的實際更改隔離開來。
API應提供實際表格本身的「抽象」版本,以滿足用戶需求並將它們與實際底層數據庫的更改隔離。
+1 - 這將是在數據庫層本身中使用視圖的等價物(反正應該可能實際使用)。 –
很好的答案。你發現我對這種方法含糊疑慮的原因。謝謝。 – h0b0
我會建議你limitting帳戶的用戶通過修改權限,只允許用戶從SELECT
表。不允許更新,插入或刪除記錄集。儘可能鎖定用戶,可能在桌面級別。
如果WHERE
條款僅限於幾列和比較僅限於>, =
或<
那麼也許你可以只是有一些額外的參數,用戶通過代表列和比較。然後,您可以在服務器端安全地構建WHERE
。
如果這是太亂了,然後通過各種手段讓他們通過一個完整的WHERE
條款 - 這不是太難消毒,如果你結合起來,與下一個鎖定的帳戶運行查詢(SELECT
只),那麼任何潛在的損害是有限的。
個人而言,我不希望讓用戶能夠在SQL直接傳遞到我的數據庫,風險實在是太大了。
如果你沒有趕上所有注入嘗試你的風險無論是數據失竊,有人只是摧毀你的數據庫或劫持它的一些其他用途,你真的不想。
WHERE 1 = 1; DROP bobby_tables;' – MatBailie
@Dems +1 for XKCD Reference – Purplegoldfish
即使您強迫我只能修改where子句,我也可以用表掃描來拒絕您。 :| – StrangeWill