2012-09-01 77 views
3

我在我的iOS應用程序像這樣的代碼:如何防止未經授權的HTTP請求?

URL *url = [NSURL URLWithString:@"http://urltomyapp.com/createaccount"]; 
ASIFormDataRequest *createAccountRequest = [ASIFormDataRequest requestWithURL:url]; 
[createAccountRequest setPostValue:email forKey:@"email"]; 
[createAccountRequest setPostValue:password forKey:@"password"]; 
[createAccountRequest startAsynchronous]; 

在我的服務器上執行,我簡單地採取通過self.request.get(「電子郵件」)此信息,並創建一個帳戶,沒有做任何檢查或任何東西。然而,似乎任何人都可以輕鬆地運行上面的代碼(我的意思是你需要做的就是複製上面的代碼並把它放到你自己的應用程序中,對嗎?),所有他們需要知道的是服務器地址,他們可以將他們想要的任何數據附加到請求中,服務器將繼續爲它們創建一個帳戶。

我該如何授權請求才能知道他們來自我的應用程序和我的應用程序?這是一個普遍的問題嗎?其他產品如何防止這種情況發生?

回答

2

首先,免責聲明。我當然不是不是的網絡專家,也不是我的安全專家。事實上,我根本就沒有回答的唯一原因是Stackmonster的答覆中的討論。

但是,我知道攔截SSL連接非常容易,尤其是在用戶是同謀的情況下。

一般來說,我認爲以下是一些好處。

您必須確定您嘗試保護的是誰/什麼。如果你只是想保護應用程序和服務器之間的通信數據,https將會很好。外部監聽與窺探其他SSL流量一樣有效(或無效)。但是,如果你試圖保護你的API(你的問題似乎暗示了這一點),那麼用戶看到你發送的命令是很簡單的(就像你自己用Charles發現的那樣),這是微不足道的。

那麼,你想阻止任何人知道你的API的細節嗎?你想只是防止DOS攻擊,或者只讓有效用戶發出命令,或者什麼?

然後,您可以擔心身份驗證和授權(兩個不同的主題)。也許驗證請求來自已知實體就足夠了。

無論如何,指導是非常困難的,因爲您首先必須決定您的網絡隱私目標是什麼。

然後,如果他們是崇高的,你在閱讀很多。

但是,在某些時候,您必須決定什麼對您的應用/業務至關重要,哪些不是。就像任何優秀的軟件設計一樣,然後創建一組要求。然後,按照某種順序排列優先次序(例如,強制性的,基本的,好的,可以沒有的)。

這會告訴你,如果你需要額外的安全性和什麼樣的。

然而,大多數人發現,即使鎖上所有的門和擋住窗戶,也不值得浪費時間和金錢(更不用說保護煙囪,在牆壁,地板和天花板上添加混凝土,房間,並僱用武裝警衛)。

+0

我不想過度安全或偏執。我認爲我不理解的是(作爲一個例子):我在我的服務器「createaccount」中有一個url,它需要發送兩個參數與請求:電子郵件和密碼。這個腳本不需要任何身份驗證(我的意思是我可以在這裏進行身份驗證),所以似乎任何一個(無論如何都沒有理由)可以通過10,000次迭代發送一個for循環,向這個url發送請求並創建10,000用戶帳戶。也許這不會經常發生,但是什麼阻止了它的發生?我不應該爲此擔心嗎? – Snowman

+0

你應該擔心嗎?只有它很重要。在這種情況下,您將不得不採用某種類型的服務器端措施來檢測/防止您不需要的行爲。如果您的服務器端口向互聯網開放,任何人都可以向您發送他們想要的任何內容。如果標準服務器不夠用,則必須採用服務器端措施。最後,如果有人決心濫用你的服務器,那麼防禦時間和金錢都會花費你很多。我想大多數人都選擇把門鎖上,然後等待看看他們是否需要做更多的事情。 –

2

使用HTTPS並在應用程序中放置證書以驗證客戶端是否允許與服務器通信。

但是相信我,它真的不值得這一切。使用HTTPS通常可以自行使用。

+0

我正在使用HTTPS,但是這是如何改變的? – Snowman

+0

如果您使用HTTPS,則無法嗅探客戶端到服務器的流量。但是,您的服務器確實存在,因此可以在網絡上調用它。如果您向客戶部署證書,則只有擁有證書的客戶才能與您通話。 只有這樣才能防止它。但是它並不那麼重要,如果您使用HTTPS違規客戶端通常不知道如何與您的服務器通信,那麼它們將會出錯。 –

+0

我以爲使用HTTPS只是啓用您的服務器中的複選框,並更改網址使用https://而不是http:// ..?有人仍然不能向https:// url發送請求嗎?我會有什麼,他們不會有? – Snowman