2012-10-16 17 views
7

我真的很難弄明白這一點。花了大約4小時爬網沒有SO帖子來救我。我如何從Chrome擴展內部安全地更新遠程數據庫?

想象一個場景:

  1. 我已經寫了一個Chrome擴展,捕獲網頁上(主要是點擊一個按鈕)一些特定的動作。該動作觸發一個函數,捕獲一些用戶信息和按鈕信息(全部出現在頁面本身)並顯示它

  2. 現在我希望插件應該能夠更新到遠程的數據庫設置服務器。

因爲我精通PHP(因此MySQL是不錯的選擇),我在尋找一個解決方案,以確保更新從擴展本身,並僅製造。

對此,我認爲最好的選擇是運行GET/POST請求,比如http://remoteserver.tld/update-db.php?id=XXXX&action=YYYYY&foo=bar ....等。但是如果用戶打開/傳遞post vars到外部插件以外的地址會發生什麼?

數據仍會更新,完整性將會丟失!

下一個最好的想法是將請求包含在密鑰中,但再次使用JS編寫擴展,幾乎任何人都可以嗅出密鑰。

指導我找到更新遠程服務器上數據庫的最佳方法,並確保操作已通過身份驗證。

乾杯!

+5

任何人都可以嗅到鑰匙,任何人都可以嗅出擴展的做法。完美的安全性基本上是不可能的挑出你願意合作的風險水平,並保證事情到達這一點,沒有進一步 –

+0

這是真的......但是我會在服務器端做一個方法,檢查是否需要更新數據庫來自插件,還是來自僞造的頁面?...您認爲我擁有@MarcB的哪些選項?...您對此有何看法?...請記住它需要儘快儘可能...因爲將有100多名用戶在Intranet上工作更新主機... – whizzzkid

+0

讓我們說我正在爲一個技術先驅工作,並需要一個堅實的方法來保護這些數據的僞造...因爲我相信這裏的書呆子會嘗試並將這些數據轉化爲最佳...感謝您的意見@MarcB – whizzzkid

回答

2

這裏的問題基本上是認證之一,你想阻止任何人能夠更新任何其他數據存儲。

最明顯的解決方法是發送一個難以枚舉的附加參數(散列是一個很好的例子),並且只分配給您的擴展的一個實例(因此每個用戶都會生成它自己的認證散列) 。

爲了使這個散列有效,重要的是它是不可猜測的。 不要僅基於ip-adressess或用戶代理字符串等靜態內容創建散列。

您可以包含這些靜態字符串以減少碰撞的可能性: [pseudo] sha1(ip_address + user_agent + random_integer)。

所以基本上對你來說,這個結果如下: 讓擴展爲當前實例生成一個散列,如果它是第一次運行的話,向你的服務器發出一個初始請求來「註冊」這個新實例,全部隨後有這個散列的請求將對該實例進行認證。

另外,使用SSL加密連接來防止嗅探。

請不要通過諸如XOR之類的默默無聞的方式來解決這個問題,人們會發現。

哦,順便說一句,如果你的問題是關於數據完整性本身,你不能解決這個問題。發送的數據始終由用戶提供,因爲機器所做的一切都在該用戶的控制之下(假設)。

+0

謝謝@garuda:在寫這篇文章之前,我已經想到了。但問題是mroe或更少: 可以說更新數據庫我發送數據到遠程作爲http:// remote/update /?data = 但如果它沒有被插件更新,任何人都可以使用瀏覽器運行添加到數據庫,或者運行一個shell腳本來增加這些記錄 – whizzzkid

+0

我最初的計劃是:用戶將數據更新到數據庫中,並且更新頁面返回一個id哈希值,所以下一次插件更新時,它只能更新if它僅包含該散列,並且在每個查詢中都會重新生成該散列! – whizzzkid

相關問題