2014-04-01 89 views
2

我試圖用一個簡單的例子來演示我的問題:我在android中有一個小應用程序,用戶可以在其中登錄並保持登錄。因此,我知道用戶標識並擁有它存儲在智能手機上。與PHP服務器通信的Android應用程序

現在在我的服務器上,我有一些用戶特定的條目,它們會不時變化。我會以某種方式下載它們,以便這些條目在應用程序本地可用,但顯然只有登錄用戶的相關條目。

如何安全地做到這一點?

我可以設置一個PHP腳本,它將具有指定ID的用戶條目作爲JSON數據數組。但是,如何使它足夠安全以至於沒有人可以利用腳本,例如直接從瀏覽器調用它?我的意思是我可以做這樣的事情:

<?php 
// check and validate $_GET['user_id'] 
... 

// select all entries for this id: 
$mysql->fetch('...'); 

// return as JSON: 
echo json_encode($rows); 
?> 

,然後從APP發送HTTP請求到與指定用戶ID服務器。但是我必須確保沒有其他方式可以通過這種方式來檢索數據。

其次,我必須確保沒有人能夠以這種方式利用android應用程序,將存儲的用戶標識修改爲自定義指定的用戶,然後使用該應用程序來檢索不同用戶的數據。這意味着,絕不能以任何方式改變當前登錄的用戶的本地存儲的用戶ID。 如何做到這一點?


沒關係,wtsang02答案:存儲密碼(可能散列/鹽醃)在應用的Android存儲用戶ID在本地:我看到以下優點:

  1. 當用戶試圖以任何(黑客/黑客)方式修改本地存儲的用戶標識 - 他不能從服務器爲不同的用戶(不同的用戶標識)獲取信息,因爲他明顯不知道其他用戶-id的密碼。
  2. 當有人通過我們的應用程序的主頁更改密碼時,他需要在應用程序內登錄,因爲存儲的密碼與在線數據庫中的密碼不再匹配。
  3. 我可以像上面發佈的那樣使用PHP腳本,而不需要直接將瀏覽器調用隱藏起來,就像(###)一樣。因爲每個來自瀏覽器的調用都不會簡單地產生具有特定用戶標識的用戶的數據庫條目,因爲您需要知道密碼本身(然後它可能會以任何方式合法地檢索數據因爲你被認證了),但是用戶還需要知道saltedPassword是如何精確計算的(散列函數,鹽的種類,迭代次數等)。

(###)

// check and validate $_GET['user_id'] and $_GET['saltedPass'] 
... 
if(correctCredentials()) { 
    // select all entries for this id: 
    $mysql->fetch('...'); 

    // return as JSON: 
    echo json_encode($rows); 
} 

------->但儘管如此,一個很大的問題是:當我在本地存儲的Android應用程序存儲中的用戶ID,它是真的有可能讓用戶以任何方式修改它?我以爲當地的Android存儲將是安全和限制爲特定的應用程序使用!?

在此先感謝

回答

2

讓我們先回答第2個問題。

我必須確保沒有人可以利用的,他修改了存儲的用戶ID

這將無法正常工作是 方式Android應用程序,因爲在用戶側什麼,你不能相信。無論如何,他們都可以修改它。

現在作爲你的第一個問題,爲什麼不把你的用戶名和密碼存儲在手機上。每次需要檢索數據時,都會將用戶標識和密碼傳遞到服務器進行驗證。這樣,用戶修改用戶標識或密碼無關緊要。而作爲普通用戶,如果您將其存儲在本地,則不需要更改其密碼並重新登錄。

更新:

任何本地存儲是不是安全。任何有根設備都可以查看/編輯您的應用程序具有的任何文件。它無法通過非固定設備查看。但是,您爲那些根植設備的百分比或試圖破壞應用程序的人添加安全測量,因此您無法考慮設備安全百分比。

正如評論指出的那樣,如果發送密碼,請使用POST而不是GET。

+0

非常感謝您的回答。請看我上面更新的問題:-)!? – tim

+0

永不發送密碼通過GET。始終使用POST,如果可能的話使用SSL。 –

+0

@Javier ProvechoFernández:是的,我會這樣做,但是請問爲什麼?但是,無論如何,我會通過POST發送它 - 發送鹹味密碼很好,不是嗎?如果服務器支持它,甚至可能使用SSL ... – tim

相關問題