2011-03-07 141 views
1

我有一個AJAX密集型Web應用程序,請求是不安全的,這意味着沒有客戶端標識。我不檢查它是否在服務器上發出請求。只允許某些客戶端進行AJAX請求

最近我發現有人用我的ajax請求網址創建了一個模仿我的網絡應用的iPhone應用。我添加了一個過濾器,通過查看用戶代理字符串來放棄iPhone的請求。這絕對是一個臨時解決方案。

而不是阻止某些用戶代理,我如何確保請求來自我的應用程序?如果我添加更多的服務,如FB應用程序,谷歌小工具等我希望這些提出請求。

問題是我如何確保請求來自我的應用程序並丟棄其他所有內容。

+0

Ajax安全性與同步表單提交安全性沒有區別;儘可能使用會話和IP日誌記錄技術;在服務器端驗證IP和會話。 – vPJ 2011-03-07 19:56:13

+0

@vPJ - 驗證IP和會話對什麼?仍然無法知道「會話」不是內置於iPhone應用程序中的代理。 – Tony 2011-03-07 20:35:27

回答

0

你可以使用一個特殊的標記,你發送的響應,你會尋找在AJAX調用。這將確保調用者必須首先加載您的網頁。但是,這仍然不能保證用戶不是來自iPhone應用程序。該應用程序可以簡單地處理相同的信息並充當代理,並且無法根據HTTP請求來判斷。

您的網站有任何使用條款定義?如果有,應該做的第一件事就是聯繫Apple,告訴他們該應用程序違反了您的使用條款,並且希望該應用程序被撤消。如果沒有,您應該寫下一些使用條款,並聯系應用程序的作者,通知他們有關更改,並要求他們停止使用應用程序,或者採取其他措辭。如果所有這些都失敗了,最好的辦法就是直接使用AJAX調用更加困難。簡單的事情,如混淆和最小化的JS(和重命名你的服務器功能不好命名)將提高抓你的數據欄。

+0

你有沒有建議創建令牌的方法? – 2011-03-07 20:57:50

+0

@Aravindan Spike上面提到的CSRF toekn正是我所說的。 – Tony 2011-03-08 16:28:28

1

您永遠無法確定它是否是您的應用程序,僅僅是因爲您的應用程序發送給服務器的所有內容都可以由任何其他應用程序發送。但是,您可以使您的服務更難以使用,而不是您的應用程序。您可以將某些密鑰作爲參數或URL的一部分發送,並且這些密鑰會經常更改,並且必須包含在您自己的腳本中。這會讓它在其他應用程序中找到並使用它非常微不足道,但是如果這是每小時發生更改的東西,那麼至少不可能編寫一個始終有效的簡單AJAX請求,而無需獲取腳本,解析它,找到鑰匙,在這種情況下,沒有人會至少假裝認爲你的服務是公開給每個人的。這幾乎是你所能做的,讓它變得更加困難和煩人。你將永遠無法做到這一點,但足夠困難可能會足夠好。

0

這會很難,因爲在某些時候您的服務器和應用程序需要共享一個祕密。該祕密將隨應用程序分發,並可供逆向工程師使用。現在您可以爲每個表單添加一個CRSF標記(請參閱this wiki)。分發一個應用程序,然後將其確定爲您的應用程序是AFAIK尚未解決的問題。

+0

出於好奇,如果這仍然是一個未解決的問題,像Gmail這樣的應用程序如何保護它的Ajax請求? – 2011-03-07 20:58:38

+1

他們在每個請求中放置了一個隨機數CSRF令牌。服務器向瀏覽器發送隨機值,瀏覽器在每個請求中包含該值。這個問題解決了。他們還沒有阻止我搞清楚他們的協議並編寫我自己的GMail客戶端 - 這個問題沒有解決AFAIK。 – 2011-03-07 21:40:51

+0

有趣。我怎樣才能生成隨機數? MD5,SHA?任何建議? – 2011-03-07 22:06:11

0

我不知道請求的性質,但如果用戶需要進行身份驗證,那麼您需要每次都在服務器上執行此操作。 Zed指出,這不會阻止另一位開發人員調用您的API。我同意你可以讓它變得更加困難,所以它基本上是一場軍備競賽,取決於防止這個第三方應用程序工作的重要性。

2

哎呀,我會在這裏走完全不同的路線。

告訴iPhone應用程序的創建者,你會很高興讓他們繼續使用你的服務收費。每次安裝選擇類似於.50美元左右的東西。這樣他們可以在商店裏以0.99美元的價格銷售應用程序;讓蘋果有30%的減產,並且你也會對這筆交易有所瞭解。

如果有人遇到了構建應用程序的麻煩,您不妨利用它!