質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

530閲覧

PHPで「+」を文字列として認識させる方法(暗号化と復号)

Ashi

総合スコア139

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2023/05/29 07:46

実現したいこと

jsで暗号化した情報を、PHPで復号し情報の整合性を判断したいです。

前提

js側の暗号化・PHPの復号は、下記の記事を参考にさせていただき実装しています。
https://techblog.gracetory.co.jp/entry/2022/07/20/120000

js・PHPどちらのソースコードも見本をそのまま使用させていただいております。
※現状特に不具合や懸念点はありません。

暗号化した情報をURLのパラメータとして展開、PHP側で取得($_GET)し下記のプログラムで復号しています。

php

1function decrypt($cipher, $passphrase, $salt, $iv){ 2 $iterations = 100; 3 $key = hash_pbkdf2("sha512", $passphrase, hex2bin($salt), $iterations, 128); 4 $plain= openssl_decrypt(base64_decode($cipher), "AES-256-CBC", hex2bin($key), OPENSSL_RAW_DATA, hex2bin($iv)); 5 return $plain; 6}

発生している問題・エラーメッセージ

問題点は以下の2点です

■暗号化された文字列に一定の確率で「+」が含まれる。(そもそもこれを避ける方法があればベスト)
■GETした「+」の含まれる文字列を関数などに渡すと「+」が「スペース」として認識されてしまう。

例えば、パラメータ「prm=sample+hogehoge」のような値が合った場合、
(上記decrypt関数において)「$cipher = $_GET['prm'];」として処理すると「sample hogehoge」として認識されるので復号の際に適切な値として判断されません。
ただ、「$cipher = 'sample+hogehoge';」のように直接文字列を入れれば正常に動くので、関数自体には問題があるわけではなく、
あくまでPHPで「+」を文字列として扱う方法が知りたいというのが質問の趣旨です。

試したこと

ChatGPTの指示でリプレイスやエンコードなども試してみましたが、いずれも上手くいきませんでした。

その他

大変恐縮ですが、パラメータに暗号含めるのどうなの?みたいなご指摘は一旦無しでお願いします…

何かアドバイスいただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pippi19

2023/05/29 14:31

GETパラメータで渡す時にbase64にエンコードし、 受け取り時にデコードするではダメなんですか?
Ashi

2023/05/29 21:24

コメントありがとうございます。 それだと文字化けしてしまって上手くいきませんでした。(僕のやり方がそもそも違った可能性もありますが)
int32_t

2023/05/29 22:36

PHPが実行されるときはどんなURLになってますか。
Ashi

2023/05/30 07:42

URLについている「?prm=sample+hoge+fuga」のようなパラメータはGETした時点で「sample hoge fuga」の状態になってしまいました。 そのままだと"+"が" "と判定されて復号処理が正常に動作しないのでGETしたパラメータ(sample hoge fuga)の" "を"+"にリプレイスする処理をして復号ようの関数に渡したところ正常に動きました。 $_SERVER['QUERY_STRING']でパラメータを取得したところ、この時点では「?prm=sample+hoge+fuga」のように"+”がそのまま文字列として取得できましたが、パラメータはprm以外にも複数あるので、パラメータごとにparse_strで分割したらそのタイミングでまた「sample hoge fuga」の状態になってしまいました。
int32_t

2023/05/30 08:01 編集

> URLについている「?prm=sample+hoge+fuga」のような URLがそうなっている時点で間違っています。?prm=sample%2Bhoge%2Bfuga にならないといけません。 ブラウザはそのURLにどうやって遷移しましたか? 遷移前のページで JavaScript で URL を作りましたか?
68user

2023/05/30 11:49 編集

(ズレてたので削除)
68user

2023/05/30 11:41

もう一度考えてみました。 PHP なら $_GET や $_POST であれば URL デコードされたものが入っているはずなので、リクエストが + であろうが %2B であろが $_GET や $_POST を見れば正しい文字列になっているはず。なのに $_GET には「sample hoge fuga」が入っていたとおっしゃる。 であるならば、普通に form の一要素として prm を設定すれば application/x-www-form-urlencoded 形式にしてくれるはずなのに、それを回避するようなサーバへの投げ方を Javascript 側で行っているのでは、と思いました。
68user

2023/05/30 11:43

結果として int32_t さんと同じことを言ってますね。失礼しました
guest

回答2

0

urlにパラメータを渡すときにはエンコードが必要です

PHP

1<?=$_GET["prm"]??""?><br> 2<?=$_SERVER["QUERY_STRING"]?> 3 4<hr> 5生データ:<a href="?prm=sample+hogehoge">sample+hogehoge</a><br> 6エンコード:<a href="?prm=sample%2Bhogehoge">sample+hogehoge</a> 7

投稿2023/05/29 08:06

編集2023/05/29 08:19
yambejp

総合スコア116720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ChatGPTの指示を盲目的に信用してしまい、ずっと「+」は「%2B」に変換されていると思っていたんですが、冷静に考えたら表示上は"スペース"に変換されていたので、GETで取得した「+」の入った値に対して「str_replace()」でスペースを+に置き換えたところ正常に値が認識されました。

ご意見くださったみなさま、ありがとうございました。

投稿2023/05/29 21:27

Ashi

総合スコア139

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2023/05/29 22:35

その対処は間違いである可能性が高いです。
Ashi

2023/05/30 07:43

ご指摘ありがとうございます。 差し支えなければ詳細をお伺いできますと幸いです。
yambejp

2023/06/01 00:10

> 「str_replace()」でスペースを+に置き換えたところ正常 GETに記載されるのは生データではないのでたとえスペースを+に変えることでたまたまうまく言ったとしても同様に他の文字でも誤変換が想定されます。 解決するにはGETにわたすときにエンコードすることです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問