2012-04-11 177 views
0

我想我必須做一些API,其中Android應用程序將參數發送到一個php文件或類似的。安全地從Android應用程序寫入遠程數據庫

我想到一個應用程序,會有某種高分列表。我將如何確保提交的高分值實際上是通過應用程序實現的?說這個人達到9001分。現在,如果這隻會導致某種類型的file.php?score = 9001調用,那麼對於找到php位置並提交他們喜歡的任何內容的人來說,我並不是很安全。

在這類問題上的任何輸入?謝謝。

回答

3

有沒有辦法使這個100%的安全,因爲你無法確認其中一個請求來自的方式,但有一個方法,使之稍硬破解高分。它基本上仍然通過默默無聞的安全性,但它需要挖掘到實際的應用程序二進制文件,而不僅僅是查看網絡連接。

首先,爲您的應用選擇一個「密碼」。不要只發送分數,還要發送與分數連接的密碼的密碼散列(如SHA-256或其他)。在服務器端,重新計算與分數連接的密碼散列,並檢查它是否與提交的散列匹配。如果不是,則拒絕提交評分。 現在這比最初的方法更安全一些,因爲查看應用程序的請求並不能讓您僞造分數。然而,從應用程序中查找二進制代碼仍然會允許攻擊者恢復密碼並僞造分數提交,但這非常複雜,可能足以滿足您的需要。

當然,這並不排除能夠重複得分(一旦正確的散列已知,您可以提交一次任意數量的分數)。如果你想防止這種情況發生,那麼提交一個分數就必須這樣做:從服務器請求(隨機)ID號碼,散列分數+ ID +密碼,提交分數+散列值,然後服務器檢查這個散列值是否合適。服務器需要記住ID號碼,這對編程有一點幫助。 更簡單的解決方案是將每個得分與玩家名稱相關聯,並且每個玩家只允許1個得分。然後你可以散列密碼+名字+分數。

+0

太棒了。您的答案將會很方便,作爲實施交易安全的參考 – kishu27 2012-04-11 23:18:26

+0

當您說「足夠滿足您的目的」時,這是否意味着即使是具有在線高分列表的大型應用程序(例如,憤怒的小鳥)也採用類似的方法對此?正如你所提到的那樣,還有更大程度的隱晦?感謝一些好主意! – TragedyStruck 2012-04-11 23:24:47

0

下午好!

最好通過POST與服務器通信。所以你可以發送一個額外的參數,例如鍵,從你的應用程序到服務器,並在那裏檢查。

PHP的樣本:

<? 
$key = trim(htmlspecialchars($_POST['KEY'])); 

if ($key == 'your_secret_string') { 
    //write data to DB 
} 
?> 
+0

當你說「鑰匙」時,你的意思是什麼?我很不確定有多少源代碼可以被試圖反編譯或類似的人發現。如果我在應用程序的某個地方有一個唯一的字符串,並將其作爲POST發送,那麼是否有人能夠攔截並獲取密鑰?如何安全地執行這樣的事情? – TragedyStruck 2012-04-11 23:03:07

+0

這種方法本身並不安全。任何人都可以檢查網絡上的流量,並輕鬆地嗅探並提取這種性質的密鑰。更安全的方法是使用標準身份驗證以及https來保護流量並訪問遠程端點。 – 2012-04-11 23:06:37

+0

您也可以發送帶有認證數據的請求(401)。 – kpotehin 2012-04-11 23:07:55

相關問題