2012-10-22 123 views
4

可能重複:
Passing base64 encoded strings in URL使用base64編碼字符串URL

我正在創建將被髮送到用戶的URL。用戶然後點擊該網址,該URL告訴我該用戶是誰。

因此,我使用base64編碼添加到此鏈接的所有數據。然而,當用戶點擊鏈接時,他被重定向到404頁面,因爲編碼後的url中有'/',而zend框架路由器找不到任何路由。

任何方式我可以壓制'/'?我試過htmlentities,但它沒有奏效。

+0

替換'/'與不同的東西,例如'!'。然後在解碼之前再做相反的操作。請參閱http://en.wikipedia.org/wiki/Base64 - 您可能也想因爲使用'+'來做類似的事情。你的問題是獨立於zend框架,所以我把它從標題中刪除。在這裏看到一些指針:http://www.ruby-forum.com/topic/167232 – hakre

+0

@hakre我不確定這不能用zend特定的結構解決。如果你告訴路由器接受什麼,例如,/controller/method /作爲參數,忽略它可以工作的任何特殊字符。我對Zend沒有任何經驗,但是這可以與大多數其他框架一起工作,這些框架可以讓你編寫自定義路線。 – jurgemaister

+0

@jurgemaister:是的,從技術上講,我非常肯定你是對的,但不是對'+'字符。此*可能會破壞相對路徑(如果使用)。我建議首先將數據製作成一個明確的數據包,然後處理。也許更保守。但實際上更多的節省我會說,而不是你需要調整路由選擇的特殊解決方案,而是「正常工作」的東西。 – hakre

回答

3

我強烈建議Joe Riggs' Create URL Safe Encrypted String

提供的代碼在程序中,但轉換爲OO非常簡單。我已經用它來做你正在做的事情,其中​​一些信息(通常是用戶的電子郵件和ID的散列)被編碼/加密以供用戶點擊以激活其帳戶。

你想看看這些功能的是url_base64_decodeurl_base64_encode,其中某些字符被改寫爲安全網址(例如,刪除/~替換它)。

[編輯]

這是我的類的基於上述碼的鍵盤:http://codepad.org/lzevA4k1

用法:

$cryptUtil = new RPK_Crypt(); 
$string = 'Unencrypted string'; 
$eString = $cryptUtil->encrypt($string); 
$dString = $cryptUtil->decrypt($eString); 
var_dump($dString == $string); //true 
-1

我認爲你需要網址編碼爲字符+/=。嘗試在您的Base64編碼參數上使用urlencode()

PS:順便說一下,這將是改變:+ =>%2B/ =>%2F= =>%25

+0

404可以解碼我說的很久了。 – hakre

+0

@hakre您發送給用戶的URL必須進行編碼。 – jurgemaister

+1

如果base64字符串是路徑的一部分,三重編碼或不是,這只是不起作用。請參閱以下重複問題:http://stackoverflow.com/q/1374753/367456。 – hakre