2012-02-15 135 views
1

我常常想將用戶重定向或通過電子郵件發送的鏈接,但我想掩蓋在URL中的參數,使他們不能告訴正在發送的額外信息。屏蔽URL參數

例如,如果我想提出一個鏈接http://www.example.com/directory/,但我也想通過一個電子郵件地址的額外參數和別人的哈希:

電子郵件: [email protected]

哈希: 22sd359d5823ddg4653dfgfFSG2

我可以將它們發送到這個環節,但我不希望他們看到的參數:

http://www.example.com/directory/someone%40example.com/22sd359d5823ddg4653dfgfFSG2

所以我的第一個想法就是base64_encode()它,但是最後你會得到那些愚蠢的==符號來表示額外的字節。而且base64編碼也會產生相當長的字符串。

是否有更簡單,URL友好的方式來編碼字符串,以隱藏其內容是什麼?

通常將如何做到這一點? base64_encode()是一種標準做法嗎?

+1

'我不想'...我可以問 - 爲什麼? – 2012-02-15 12:13:15

+1

最後的'=='有什麼問題? – Phil 2012-02-15 12:14:02

+1

@Phil ==似乎有點太明顯,它已被base64編碼。但更重要的是,當您使用純文本電子郵件發送此類鏈接時,==不被視爲鏈接的一部分(至少在Outlook中,我尚未在其他電子郵件客戶端中進行測試)。所以你最後以黑色與==有藍色鏈接。 – BadHorsie 2012-02-15 12:18:37

回答

2

您可以生成一個short id和存儲什麼它假設在數據庫中做。因此,使用

http://www.example.com/directory/K2SP26 

例如將該人的電子郵件地址存儲在數據庫以及他們應該去的地方。退房http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/

+0

是的,我明白你的意思,但這是矯枉過正。可能有數百萬這些鏈接,並且我也不想每次只想重定向到一個新鏈接時更新數據庫。 – BadHorsie 2012-02-15 12:26:14

+0

用戶是否應該在一定的時間內訪問該頁面?也許通過刪除超過6個月的記錄來進行清理,甚至可以在記錄中設置過期日期。正確的索引和清理應該使這項工作。如果你使用散列,你最終不得不對它進行解碼......我想知道資源的差異是什麼。 – 2012-02-15 12:29:56

-5

它有點哈克,但如果你給他們包含頁面:作爲負載(假設他們已經啓動Javascript),他們將被重定向你想讓他們儘快

<form id="getme" action="directory/someone" method="POST"> 
<input type="hidden" name="email" value="[email protected]"> 
</form> 
<script> document.getElementById("getme").sumbit();</script> 

沒有網址dirtyness。

+0

請不要稱爲一個醜陋的解決方案「哈克」。更不用說電子郵件問題的一部分了 – 2012-02-15 12:16:26

+0

對不起,這是一個非常糟糕的解決方案。 – BadHorsie 2012-02-15 12:21:32

+0

我認爲「hacky」是將技術用於除了設計目的之外的其他技術的行爲? ...我的回答並沒有解決電子郵件問題,但我認爲這值得一提。對於我自己的學習,你能爲我解釋一下醜陋和黑客嗎? – 2012-02-15 12:24:55

-1

如果您的重定向是由PHP觸發的,我認爲將數據存儲在session將是明顯的選擇。

<?php 

function redirectTo($url, $data) { 
    session_start(); 
    $hash = md5(uniqid("rediredt", true)); 
    $_SESSION[$hash] = array(
     'my' => 'data', 
     'is' => 'invisible', 
     'to' => 'the user', 
    ); 

    $delim = strpos($url, '?') ? '&' : '?'; 
    $url .= $delim . 'redirection-key=' . $hash; 
    // might want to send 301/302 header… 
    header('Location: ' . $url); 
    exit; // might want to avoid exit if you're running fcgid or similar 
} 

function isRedirected() { 
    if (empty($_GET['redirection-key'])) { 
     return null; 
    } 

    if (!isset($_SESSION[$_GET['redirection-key']])) { 
     return array(); 
    } 

    $t = $_SESSION[$_GET['redirection-key']]; 
    unset($_SESSION[$_GET['redirection-key']]); 
    return $t; 
} 

可以幫助你掌握想法...

+0

沒關係......我沒有看到»給他們發送鏈接«部分。如果這是最基本的想法,請與@亞倫的想法一致。這是真正向用戶隱藏數據的唯一解決方案。如果我看到base64編碼的數據,我會因爲好奇而解碼 - 任何人都可以。 – rodneyrehm 2012-02-15 12:33:31

-2

你有兩個選擇:

  1. 的電子郵件地址被散列,並因此由薩維用戶進行解碼。
    - 或 -
  2. 的電子郵件地址存儲在您的服務器(數據庫)上和電子郵件中的鏈接只包含數據庫的主ID。

如果你想要最安全的方法,也給出了最漂亮的網址,請使用方法2.如果你絕對不希望存儲的電子郵件地址在數據庫中,然後可以使用通用的哈希值,例如爲base64甚至rot13,或者滾動你自己的。你會發現,滾動你自己並不是簡單的,但它會阻止大多數偶然用戶試圖窺視哈希。

1

可能是一個愚蠢的答案,但爲什麼不使用mcrypt函數來隱藏至少更偶然用戶的參數?

1

使用類似base64_encode(),gzcompress等對字符串進行編碼並不是一種很好的混淆方法,因爲對它進行解碼並不重要。是的,另一種選擇是將該值存儲在數據庫中,並按照人們的建議傳遞一個密鑰。但假設你不想爲此煩惱,你真正應該做的是使用私鑰對其進行實際加密,然後用相同的密鑰對另一端進行解密。

例如:

function obfuscateString($s) 
{ 
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461"; 
    return openssl_encrypt($s, 'AES-256-CBC', $secretHash, 0, '123456789'); 
} 

function unobfuscateString($s) 
{ 
    $secretHash = "BA2EC9E717B68176902FF355C23DB6D10D421F93EAF9EE8E74C374A7B0588461"; 
    return openssl_decrypt($s, 'AES-256-CBC', $secretHash, 0, '123456789'); 
} 

(需要PHP版本> = 5.3.0)用自己的祕密進制的字符串替換$ secretHash。

注意:在這個例子中,初始化向量('123456789')只是一個填充字符串,但沒關係。您可以想出一種使用獨特初始化向量的方法,但在大多數情況下,對於混淆URL參數的目的來說並不重要。