我試圖用一個簡單的例子來演示我的問題:我在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在本地:我看到以下優點:
- 當用戶試圖以任何(黑客/黑客)方式修改本地存儲的用戶標識 - 他不能從服務器爲不同的用戶(不同的用戶標識)獲取信息,因爲他明顯不知道其他用戶-id的密碼。
- 當有人通過我們的應用程序的主頁更改密碼時,他需要在應用程序內登錄,因爲存儲的密碼與在線數據庫中的密碼不再匹配。
- 我可以像上面發佈的那樣使用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存儲將是安全和限制爲特定的應用程序使用!?
在此先感謝
非常感謝您的回答。請看我上面更新的問題:-)!? – tim
永不發送密碼通過GET。始終使用POST,如果可能的話使用SSL。 –
@Javier ProvechoFernández:是的,我會這樣做,但是請問爲什麼?但是,無論如何,我會通過POST發送它 - 發送鹹味密碼很好,不是嗎?如果服務器支持它,甚至可能使用SSL ... – tim