私の電子メール確認スクリプトでは、私の既存の一方向暗号化機能を使用してユーザーの電子メールアドレスを実行し、その中間から20文字を取得してトークンを生成します。私はトークンを$ _GET変数または$ _POST変数としてユーザーから取得します。私は "バグ"に遭遇しました。電子メールアドレスにプラス記号(+)が入力され、そのトークンが$ _GET変数としてユーザから取り戻されると、プラス記号はスペースに変換され、ハッシュが変化し、そのためトークンはもはや一致しない。
これを回避するにはどうすればよいでしょうか?プラス記号を脱出する?プラス記号を変換しますか? URLエンコードする? $ _GETを使用すると、他の文字はどうなりますか?それは便利だ場合にはここで
は、適切なコードです:
<?php
if (isset ($_GET['email'], $_GET['token'])) {
$email = strtolower (mysql_real_escape_string($_GET['email']));
$token = mysql_real_escape_string($_GET['token']);
$correctToken = substr (doEncrypt ($email), -26, -6);
}elseif (isset ($_POST['submit'])) {
$email = strtolower (mysql_real_escape_string($_POST['email']));
$token = mysql_real_escape_string($_POST['token']);
$correctToken = substr (doEncrypt ($email), -26, -6);
}
if (isset ($email, $token, $correctToken)){
if ($token == $correctToken) {
// Confirm user's email!
}
}
?>
はどうもありがとうございました! Billy
編集:OK、これは最大の問題です。プラス記号は$ _GETで検索したときにスペースに変換される唯一の文字ですか?そうであれば、$ _GETセクション内にこれを追加することができるようです:$email = str_replace(' ', '+', $email);
スペースはメールアドレス内にある他の理由はありませんか?それは私だったら、再び、 ビリー
はい、[urlencode'](http://php.net/urlencode)は(メールを送信する前に)最も適切です。 – mario
可能な複製[PHP - GETクエリ付きプラス記号](http://stackoverflow.com/questions/2671840/php-plus-sign-with-get-query) – mario
[PHPでは文字列をhtmlspecialchars()を使用して不正な文字を処理するか、正規表現を使用する必要がありますか?](http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-database-should- i-take-care-of-illegal-cha) –