2014-12-23 80 views
1

想象一下,我有一個用Java實現的網頁,可在http://mycompany.com/page1.xhtml?trafficSource=someTrafficSourceIdentifier&checkSum=...處獲得。如何驗證URL參數沒有被篡改?

我想跟蹤不同流量來源(如不同的廣告系列)生成的網頁訪問量。爲此,我有trafficSource參數。該組流量來源ID被限制爲5個可能的值(例如Google有機,Google AdWords,YouTube,Facebook,Twitter)。

想象一下,我想確保trafficSource沒有被篡改(沒有人給它放過不同的值)。爲此,我介紹checkSum參數。

什麼是爲字符串X(checkSum = f(X))創建校驗和的最簡單方法,以便將不同的輸入字符串轉換爲不同的校驗和?

該措施的目的是檢查我的參數基本

我試圖使用以下內容,但它會生成一個包含非字母數字字符的字節數組,我無法將其放入URL中。

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class CheckSumGenerator { 
    public String calculateCheckSum(final String aInput) throws NoSuchAlgorithmException { 
     final MessageDigest md = MessageDigest.getInstance("SHA"); 

     final byte[] checkSumBytes = md.digest(aInput.getBytes()); 

     final String result = new String(checkSumBytes); 

     return result; 
    } 
} 
+0

如果問題所在的值不是這5個值之一,那麼只做字符串比較會更快。如果問題是人們僞造哪個站點,那麼問題是不可能的,因爲他們可以從他們正在模擬的任何站點複製checkSum。 – Vitruvius

+0

我無法創建一個密鑰(只有我知道),然後使用該密鑰爲每個有效的字符串創建校驗和?然後,當有人更改'trafficSource'參數時,他或她將無法生成正確的'checkSum',因爲只有我擁有密鑰。有沒有簡單的方法來做到這一點? –

+0

如果您可以說服Google,Facebook和Twitter創建特殊的PHP來重新計算您的鏈接,以便在每次向用戶提供當前時間和共享密碼時加入散列,當然。 – Vitruvius

回答

1

您可以從http請求標頭獲取服務器端的引用鏈接,這對用戶不可見。這可以確定來自YouTube或Facebook的訪問者。

要解決將散列轉換爲字母數字字符串的問題,可以將結果字節轉換爲十六進制代碼。

final String result = DatatypeConverter.printHexBinary(checkSumBytes); 
+0

即使這可能會被篡改,但它仍然比傳遞純字符串值更好。 – user2366842