2011-01-19 72 views

回答

22

是的,CouchDB可以防止未經授權的讀取。不幸的是,它不那麼簡單。

想象一下祕密拍賣應用程序。你出價20美元,我出價10美元;每個出價在沙發文件。沙發讓我們閱讀我們自己的投標文件,但沒有其他人。 但是,有一個顯示平均值的map-reduce視圖。我加載視圖並查看平均值爲15美元,因此我認爲您的出價爲20美元,並且我違反了安全策略。 視圖輸出可能泄漏部分或全部文檔的信息。在文檔級執行安全措施是不可行的。這就是讀訪問權限在數據庫級別的原因。

我知道,它吮吸。但這是唯一正確的,可擴展的答案。

這是部分原因的沙發理念是爲每個用戶創建許多數據庫—甚至一個(或多個)。對數據庫的讀取權限設置爲數據庫_security對象的readers值。 (請注意,現場readers was renamed to members CouchDB中主幹,因爲它也指定誰可以寫入到數據庫。)

該技術的工作原理是這樣的:

  1. 爲每個用戶創建一個數據庫。它將保存用戶可能讀取的所有文檔。將用戶(或用戶的角色)添加到_security對象。
  2. 在master數據庫中,創建一個實現讀取策略的過濾函數。從主數據庫到用戶與?filter=my_filter_function數據庫(這可能與validate_doc_update共享代碼。)
  3. 複製。
  4. 允許用戶加載(或複製)他們的數據庫。

當然,這完全是爲了一個純粹的Couch應用程序,用戶可以直接訪問Couch。如果你有一箇中間層(MVC控制器,或者只是一個反向HTTP代理),那麼你可以在用戶和沙發之間執行策略。但要小心。例如,_show函數或_rewrite規則可能允許用戶加載視圖或文檔,而不考慮您的策略。

祝你好運!

+0

謝謝!您能否詳細說明_show和_rewrite如何咬我?此外,我如何避免競爭狀況,如「不友好的人 - >上傳照片」,並且100%確信這位不受邀請的人永遠看不到那張照片? – nornagon

+0

那麼,假設你有一個反向代理,它允許/拒絕每個用戶根據URL訪問每個文檔。稍後,您使用_list函數添加新功能,並且代理允許所有_list查詢。用戶可能會想出如何使用_list來查看他不應該看到的文檔。同樣,一個_rewrite規則可以提供一種方法來查看沒有正常的'/ db/doc_id'路徑的文檔。所以你必須非常確信你的代理沒有漏洞。 – JasonSmith

+2

你的第二個問題更多的是關於**取消**讀取權限而不是**授予**讀取權限。我建議你問一個新問題(「如何撤銷CouchDB安全模型中的讀取訪問權限」)。如果可以的話,我會盡快答覆! – JasonSmith