2011-06-03 35 views
3

我的Android應用程序有一個與其關聯的應用程序小部件,每10分鐘在Android設備上更新一次。這些更新將HTTP請求發送到服務器,並解析服務器響應並根據需要更新應用程序。確定是否來自Android應用程序的HTTP請求?然後做出適當的迴應

截至目前,如果您從筆記本電腦或PC上的瀏覽器ping該URL,服務器將響應並更新服務器上的數據庫中所需的任何內容。

我想要做的是在服務器接收到HTTP請求時,我想確定請求是否來自Android設備的Android應用,然後響應數據。我想要改變服務器上PHP代碼的方式,如果HTTP請求來自瀏覽器或除我的Android應用以外的其他任何內容,它們將顯示或重定向到某個頁面。從應用

典型的HTTP請求,就像http://example.com/abc.php?usera=abc&datab=xyz

我不想,如果它是從其他地方來,除了從Android應用程序到這個網址作出反應以同樣的方式。這可能嗎?什麼是實現這個目標的好方法。

感謝您的幫助。

+0

我瞭解用戶代理標題,不能否認仍然有機會調整...我在想如果有什麼方法可以使這種動態...! – Aakash 2011-06-03 06:52:20

回答

7

您可以將簽名添加到請求中,然後在服務器端進行檢查。

只需要查詢並在末尾添加一個祕密字,然後創建一個可以作爲頭髮送(或用作用戶代理)的MD5。並在服務器上做同樣的事情,並檢查校驗和是否相同。

爲了讓它更安全一點,您可以創建一個時間戳,以便請求僅在短時間內有效。

讓您的查詢看起來像http://example.com/abc.php?usera=abc&datab=xyz&timestamp=123456789其中timestamp是當前時間(UNIX時間戳),並在您的應用程序添加此:

public static String makeCheck(String url) 
{ 
    URL u=new URL(url); 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    u.getQuery(); 
    md.update(u.getQuery().getBytes()); 
    BigInteger bn = new BigInteger(1,md.digest("A_SECRET_WORD".getBytes())); 
    return bn.toString(16); 
} 

而當你需要添加頁眉使用類似:

request.addHeader("X-CHECKSUM", makeCheck(url)); 

那麼你的服務器上,你可以使用:

if (md5($_SERVER['QUERY_STRING']."A_SECRET_WORD")!=$_SERVER['X-CHECKSUM']) { 
    // Wrong checksum 
} 

$timediff=60; 

if ($_GET['timestamp']>(time()+$timediff) || $_GET['timestamp']<(time()-$timediff)) { 
    // Bad timestamp 
} 

[R因爲你的服務器時鐘和電話時鐘可能會關閉同步,所以記錄在時間戳上有點鬆懈。

+0

我喜歡這種方法,但更重要的是而不是時間戳上的一些冗餘,就是在客戶端和服務器上使用相同的時區 - 這意味着明確使用某個時區。 – gnud 2011-06-03 07:31:46

+1

如果您使用unix時間戳,則它在任何地方都是一樣的。因此,雙方都沒有必要擁有相同的時區 – 2014-06-04 06:41:51

+2

A_SECRET_WORD嵌入在Android應用程序中?呃..安全嗎? – Jasper 2015-02-04 08:49:11

3

這樣做的典型方法是在HTTP請求中使用User-Agent頭。如果請求來自標準瀏覽器,它將唯一標識硬件和軟件。例如,一個歌Nexus One運行的Froyo將具有以下的User-Agent:

Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 

但是,如果你使用的HttpClient,使您的應用程序的請求,你可以自定義HttpClient的使用所證實的User-Agent頭在這個答案:Android HTTP User Agent

在服務器端,您可以在用戶代理標頭上使用正則表達式匹配來確定請求是否源自您的Android應用程序,併發送相應的響應。

+0

[Android設備的用戶代理字符串列表](http://www.gtrifonov.com/2011/04/15/google-android-user-agent-strings-2/) – 2011-06-03 06:42:13

1

當您創建Android中你可以設置以下

client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "MY Android device identifier"); 

此設置USER_AGENT每個HTTP請求發送到服務器的HttpClient的。在您的服務器上,您可以檢索USER_AGENT以確定請求來自您的Android設備

1

如果實際請求相同(例如,您無法添加POST或GET變量來主動識別您的請求) ,你必須依賴其他的東西,比如用戶代理。

儘管您可以根據自己的願望在應用中設置它們(請參閱@mark_bakker nd @mark_allison的答案),但您應該意識到有些方法可能會導致此問題,因此請勿將其用於某些東西你真的不希望其他用戶看到。

  • 一個android用戶理論上可以改變請求離開你的應用程序和請求離開他/她的網絡之間的user_agent字符串。因此,不要將它用於「Android用戶沒有支付,所以不應該看到這個/那個信息」應用程序
  • 相反,非android用戶可以明顯改變他們的用戶代理,所以如果你有內容只有你付費的android用戶應該看到,他們可能會僞造字符串。

最後,如果您可以更改您的要求可能會更好:您希望得到不同的回覆,您應該做不同的要求是我的看法。

相關問題