2011-11-02 82 views
3

我正在公開一個或多或少的公共API,允許用戶從數據庫中查詢數據集。由於用戶需要過濾出特定的數據集,因此我試圖接受SELECT語句的WHERE部分作爲API參數。因此,用戶可以按照自己喜歡的方式執行復雜的查詢,而無需擔心混亂的API接口。在公共API中允許一些SQL?

我所知道的,我將不得不捕獲SQL注入嘗試的事實。

你認爲這會繞過一個API包裝數據庫的目的太多,否則你會認爲這是一個明智的做法?

+5

WHERE 1 = 1; DROP bobby_tables;' – MatBailie

+1

@Dems +1 for XKCD Reference – Purplegoldfish

+0

即使您強迫我只能修改where子句,我也可以用表掃描來拒絕您。 :| – StrangeWill

回答

5

在一般情況下,我建議不要讓他們在他們的請求

嵌入實際的SQL你可以讓他們在他們的要求提交where條件很容易:

<where> 
    <condition "field"="name" "operator"="equal" "value"="Fred"/> 
</where> 

或類似的東西。

這樣做的價值是木裏倍:

  1. 你分析每個條件,並確保他們正確運行之前
  2. 您可以創建「假」的領域,如「FULL_NAME」這可能不存在。
  3. 您可以限制他們可以放置條件的列
  4. 您可以將用戶與基礎數據庫中的實際更改隔離開來。

我認爲最後一點其實是最重要的。將需要對數據庫的基礎模式進行更改的那一天即將到來。最終,它會發生。此時,您會欣賞在用戶發送的內容和查詢之間有一些「翻譯」層。它將允許您將用戶與底層數據庫中的實際更改隔離開來。

API應提供實際表格本身的「抽象」版本,以滿足用戶需求並將它們與實際底層數據庫的更改隔離。

+0

+1 - 這將是在數據庫層本身中使用視圖的等價物(反正應該可能實際使用)。 –

+0

很好的答案。你發現我對這種方法含糊疑慮的原因。謝謝。 – h0b0

4

我會建議你limitting帳戶的用戶通過修改權限,只允許用戶從SELECT表。不允許更新,插入或刪除記錄集。儘可能鎖定用戶,可能在桌面級別。

0

如果WHERE條款僅限於幾列和比較僅限於>, =<那麼也許你可以只是有一些額外的參數,用戶通過代表列和比較。然後,您可以在服務器端安全地構建WHERE

如果這是太亂了,然後通過各種手段讓他們通過一個完整的WHERE條款 - 這不是太難消毒,如果你結合起來,與下一個鎖定的帳戶運行查詢(SELECT只),那麼任何潛在的損害是有限的。

0

個人而言,我不希望讓用戶能夠在SQL直接傳遞到我的數據庫,風險實在是太大了。

如果你沒有趕上所有注入嘗試你的風險無論是數據失竊,有人只是摧毀你的數據庫或劫持它的一些其他用途,你真的不想。