プロが教える店舗&オフィスのセキュリティ対策術

現在PHPでフォームの作成を行っているのですが、参考にしているページなどを見ていて疑問に思うことがありましたので、お詳しい方アドバイスを頂けますと幸いです。

といいますのが、入力フォームの情報を保持して使いたいときにSESSIONなるものが利用できるとのことで試しているのですが、参考サイトにはいろいろな書き方があるようなのですが、例えば確認ページで受け取る際に…。

$_SESSION["name"] = $_POST["name"];

としていたり、

$post = $_POST["name"];

として、作った変数に入れてから$post["name"];と使ったりしています。

そこで質問なのですが、$_SESSION["name"]で受け取れば、その後、サンクスページや自動返信文でこのSESSIONを利用して色々と情報が使えまわせると思うのですが、なぜ、わざわざ$postといった感じで一旦普通の変数に入れるのでしょうか?変数に入れてしまうとこの情報は今後遷移後のページで使えず、また再度取得しなければならないかと思うのですが…。

何だか変な質問で、私自信もうまく質問の内容がお伝え出来ないのですが…。
変数に入れ直した方が安全とかあるのですか?また、ずっと他のページに遷移後も$_SESSION["name"]のままで使い続けても問題無いのでしょうか?
お詳しい方、宜しくお願いいたします。

A 回答 (3件)

> すみません、こちらの検証は具体的にはどのような対応になりますか?


システムおよび業務で必要な検証です。
値が入っていない、想定を超える桁数や文字種の値が入っている、システムで許容されていない値が入っている(DBに登録されているものしか許可しない)、など。

別な方への再質問に
> $_SESSION["name"] = htmlspecialchars($_POST["name"]);
とありますが、これはおかしいですよ。
htmlspecialchars()は画面に表示する際に、値のエスケープを行うための命令です。
渡ってきた値に対して行うものではないため、セッション変数にhtmlspecialchars()を噛ませた値を保持するのは不自然です。
    • good
    • 0
この回答へのお礼

何度も有難うございます。
>>値が入っていない、想定を超える桁数や文字種の値が入っている、システムで許容されていない値が入っている(DBに登録されているものしか許可しない)、など。

なるほどです、受け取る際には想像以上に色々と確認を行わなければならないのですね。

>>htmlspecialchars()は画面に表示する際に、値のエスケープを行うための命令です。
そうなのですね、こちらは表示する際のみに使用いたします。

なんだか思った以上に行わなければならないことが多々あるようで驚きです。
まだまだ見えないところだらけですが、こちらのアドバイスを参考に進めてみたいと思います。
有難うございます!!

お礼日時:2022/11/09 18:48

「$_POST」をそのまま使うのはまずいです。


サンプルプログラムであればいいのでしょうが、実用ではサニタイズする必要があります。
変数に入れ直すのは、サニタイズしていない値を使用していないことを直観的にわかるようにするためという意味もあります。
    • good
    • 3
この回答へのお礼

有難うございます!
なるほど、いずれも安全面で使わない方が良いという事ですね。
ちなみに、以下の様に使うのもNGなのでしょうか?

$_SESSION["name"] = htmlspecialchars($_POST["name"]);

安易な考えですが、綺麗にしてからSESSIONに入れてみたのですが…。

やはり普通に一度は変数に入れ直す方が良いのでしょうか?

お礼日時:2022/11/09 12:15

セッション変数にはシステムとして問題がないデータのみが格納されるべきです。



$_POST、$_GETなどから渡される値は、必ずしもシステムとして正常な値とは限りません。
様々なツールやブラウザの機能によって不正な値を送ることも可能です。
そのため、$_POST、$_GETの値は正常性の検証が必要になります。

よって、$_SESSION["name"] = $_POST["name"] は一見問題ないような制御に思えるかもしれませんが、正しい制御とは言えません。

$name = $_POST["name"]
// ここで $name の値検証を行う。NGなら$_SESSIONには格納しない。
$_SESSION["name"] = $name;

一度セッション変数に格納された値を取り出す分には、上記が正しく制御されているなら、正常な値が担保されているので、何も気にすることなく取り出せばいいです。
    • good
    • 0
この回答へのお礼

有難うございます!
// ここで $name の値検証を行う。NGなら$_SESSIONには格納しない。

すみません、こちらの検証は具体的にはどのような対応になりますか?

お礼日時:2022/11/09 12:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!