2010-04-20 84 views
24

我有一個PHP腳本,通過下面的方法做一個字符串的基本加密加號:PHP - 用GET查詢

<?php 
$key = 'secretkey'; 
$string = $_GET['str']; 

if ($_GET['method'] == "decrypt") 
{ 
    $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 
} 

if ($_GET['method'] == "encrypt") 
{ 
    $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
} 

echo $output; 
?> 

的URL字符串進行加密的一個例子是這樣的:

Encrypt.php方法=加密&海峽=快速狐狸

這將返回這是加密的字符串:

LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHY YJFqG6tY3P0Q =

現在對字符串進行解密所有你需要做的就是改變「方法」查詢「解密」,像這樣:

Encrypt.php方法=解密&海峽= LCUT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

唯一的問題是,當該加密的字符串被解密,它返回這個:

¬ƒ§rYV}̳5Äš·NSSI(ñïX8Þ; b

我已縮小的問題的加號 即在加密的字符串中。 PHP的GET方法似乎將加號轉換爲空格。我搜查了這個bug,發現它已經被提交here。我嘗試過在該頁面上列出的不同方法,其他方面沒有成功。我得到的最接近是通過使用這樣的:

$fixedstring = str_replace(" ", "+", $string); 

,然後使用在加密方法$ fixedstring,問題是,解密時,所有空格都轉換爲加號。有任何想法嗎?

我知道使用POST會更有意義,但我使用GET的具體原因。我會省下細節。

回答

32

如果您要閱讀完整的錯誤報告,您會看到對RFC 2396的引用。其中指出+是保留。 PHP將未編碼的+符號翻譯成空格是正確的。

將密文返回給用戶時,可以使用urlencode()密文。因此,當用戶提交密文解密時,你可以urldecode()它。如果它通過GET字符串進入,PHP會自動爲您執行此操作。

底線:的+必須提交給PHP作爲編碼值:%2B

+0

我知道這是一個簡單的答案,但我通過GET發送出於某種原因。 – user 2010-04-20 00:53:30

+2

這是您的問題的正確答案。如果要在URL中的任何位置使用文字加號,則無論使用的是哪種服務器端語言,都必須進行編碼,例如將其替換爲「%2B」。這是因爲URL中的加號用作空格字符的替代,任何服務器端腳本都會將它們正確解釋爲空格字符。 – thomasrutter 2010-04-20 02:51:06

+0

啊哎呀我看到這個答案已被編輯。哦,現在是正確的。 +1 – thomasrutter 2010-04-20 02:52:07

4

你應該把加密字符串查詢字符串,這將「越獄」的任何特殊字符前使用urlencode() (包括+),然後在解密之前調用urldecode(),將其恢復爲原始形式。

+0

簡單;到了這一點。謝謝! – 2013-05-23 05:33:39

10

我意識到這是一個老問題,但我正在尋找一個類似問題的解決方案,在GET字符串中使用+符號。我偶然發現了這個頁面,並認爲我會分享我提出的解決方案。

<?php 
$key = 'secretkey'; 
$string = $_GET['str']; 

if ($_GET['method'] == "decrypt") 
{ 
    $string = urlencode($string); 
    $string = str_replace("+", "%2B",$string); 
    $string = urldecode($string); 
    $output = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 
} 

if ($_GET['method'] == "encrypt") 
{ 
    $output= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
} 

echo $output; 
?> 
+1

謝謝!看到佈置的代碼幫助了我。我需要在查詢變量中保留加號,以便在API請求的標頭中傳遞查詢變量的腳本中使用。只需編碼,用%2B代替+,然後解碼變量即可。 – 2014-02-09 21:54:14