web-dev-qa-db-ja.com

PHP-GETクエリのプラス記号

私はPHPスクリプトを使用して、以下の方法で文字列の基本的な暗号化を行います:

<?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?method = encrypt&str =クイックフォックス

これは暗号化された文字列としてこれを返します:

LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

文字列を復号化するには、次のように「メソッド」クエリを「復号化」に変更するだけです。

Encrypt.php?method = decrypt&str = LCuT/ieVa6cl3/4VtzE + jd9QPT3kvHYYJFqG6tY3P0Q =

唯一の問題は、暗号化された文字列が復号化されると、次のように返されることです。

¬ƒ§rYV}̳5Äš・nßì(ñïX8Þ; b

問題を、暗号化された文字列に含まれるプラス記号に絞り込みました。 PHPのGETメソッドは、プラス記号を空白スペースに変換するようです。このバグを検索したところ、すでに報告されていることがわかりました here 。そのページに記載されているさまざまな方法を試しましたが、成功しませんでした。私が得た最も近いものはこれを使うことです:

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

そして、暗号化メソッドで$ fixedstringを使用すると、問題は、復号化時にすべての空白スペースがプラス記号に変換されることです。何か案は?

POSTの方が理にかなっていますが、特定の理由でGETを使用しています。詳細は省略します。

34
user

そのバグレポート全体を読むと、 RFC 2396 への参照が表示されます。 +は予約済みであると述べています。 PHPは、エンコードされていない+記号をスペースに変換するときに正しく機能します。

ユーザーに返すときにurlencode()を使用できます。したがって、ユーザーが暗号化解除のために暗号文を送信すると、それをurldecode()できます。 PHPは、GET文字列を介して受信した場合にも、自動的にこれを実行します。

ボトムライン:+はPHPにエンコードされた値として送信する必要があります:%2B

43
hobodave

これは古い質問であることは承知していますが、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;
?>
10
Andrew

暗号化された文字列をクエリ文字列に配置する前に、 urlencode() を使用する必要があります。これにより、特殊文字(+を含む)が「エスケープ」され、 urldecode() 解読する前に、元の形式に戻します。

4
Chad Birch

上記の答えはどれもうまくいきませんでした。

rawurldecode() 

そして

 rawurlencode() 
2
Alex Angelico

「+」記号を含む文字列変数を使用してPHPスクリプトにURLを渡そうとしたときに同じ問題が発生しました。これを動作させることができました。

encodeURIComponent([string])

例えば:

var modelString = "SEACAT+PROFILER";
modelString = encodeURIComponent(modelString);
//"SEACAT%2BPROFILER"

%2Bは、正しい値をPHP GETに@hobodaveが言ったように渡して、正しいデータセットを返します。

これがこのような何かに出会った他の誰かを助け、上記の例に少し異なる見方が必要になったことを願っています。

1
delliottg