零細システムエンジニアの備忘録

RPA、サーバ、ネットワークに関する設定メモ、導入相談もコメント欄やメールに頂ければお答えしますのでお気軽にご相談下さい(^^)

【PHP】文字列を暗号化しGETで値を渡す方法

GETで送るとURLに色々と値が入りセキュリティ的によくないので
渡す値を暗号化して渡すようにしたときのメモです。

ネットで調べるとopenssl_encrypt、openssl_decryptで暗号化、複合化でやればいいようですが、
最初にやったところ暗号化の文字列に「?」が入り、URLとして送ることができない事象が起きました。
どうもURLの中に
そこで暗号文を16進数にして値を渡すことにしました。

色々なサイトを参考したのですが、そのままだとできなかったので
ちょっと簡略化していますが、とりあえずうまくいきました。

2つの変数を渡すことを想定しています。
そのまた[文字列,文字列]でカンマ区切りで渡すことにします。

$plain_text = "test,111111";  //暗号化したい文字列
$method_name = 'AES-256-CBC';  //暗号方式
$key_string = '1234567890';  //暗号キー 任意 長いほど良い

$encrypt_bin = openssl_encrypt($plain_text,$method_name,$key_string); //暗号化
$url = bin2hex($encrypt_bin); // 16進数に変換

これで下記のように次のページにPOSTします。
https://localhost/test.php?url=$url

遷移先のページのPHPにて下記のようにurlを取得して複合化します。

$url = $_GET["url"];

$text = hex2bin($text);
$method_name = 'AES-256-CBC';  //暗号方式
$key_string = '1234567890';  //暗号キー 上記と合わせる

$decrypt_string = openssl_decrypt($text,$method_name,$key_string); // 復号化

$data = explode(',', $decrypt_string);  //カンマ区切りで配列に挿入
$data0 = $data[0];
$data1 = $data[1];