新人PGの学び

プログラマーの卵のlog

URLのパラメータに"+"文字がある場合空白になる

■事象
URLのパラメータに"+"文字がある場合空白になってエラーになっていた

作業的にはログインIDとPASSを暗号化したURL等を確認していた


可逆暗号化のための準備

<暗号化方法>

base64でエンコード→mcrypt_genericで暗号化→base64でエンコード


 <復号化方法>

 base64でデコード→mdecrypt_genericで復号化→base64でデコード


■空だよの下記エラー

Warning: mdecrypt_generic() [function.mdecrypt-generic]: An empty string was passed in /www/XXX.php on line 87


Warning: mdecrypt_generic() [function.mdecrypt-generic]: An empty string was passed in /www/XXX.php on line 88


■該当箇所のソース

//パラメータ取得

if(isset($_GET["login_id"]) && $_GET["login_id"]){

$loginId = $_GET["login_id"];

}

if(isset($_GET["login_pass"]) && $_GET["login_pass"]){

$loginPass = $_GET["login_pass"];

}



~省く~

/*

* 復号化

*/


//ID・PASSの復号化

//エラー該当箇所の87行目

$dec_str_id = mdecrypt_generic($td, base64_decode($loginId));

$dec_str_pass = mdecrypt_generic($td, base64_decode($loginPass));




■原因
php側のグローバル関数の$_GETがURLを自動でurldecodeしていた。
urldecodeでは、"+"を空白スペースに自動変換する処理がある(半角空白、%20も同様)ため、$_GET["login_id"]取得していた時点でおかしくなっていた。
そのため、mdecrypt_genericで複合化する際、二個の文字列と判断されエラーになっていた。

■対策
各サイトを確認したが、結果的にはURL自体をエンコードすることにした。

■考え方
$_GETは、urldecode()関数を介して値が渡される


■超絶わかりやすかったサイト

→$_GET は urldecode()関数を介した値が渡されるのか!


■似た現象のサイト

→rewriteRuleで解決してる



→POSTで解決している


→URLをエンコードしないといけないのね。


■PHPで自動変換事例

→PHP は“.”(ドット)を“_”(アンダースコア)に自動的に変換する事例




→上記の旨を記載している本家PHP説明サイト
PHP: 外部から来る変数 - Manual


■URLエンコードサイト