h()がhtml文字列を出力するためのエスケープ処理を行っているのであり、
$_POST['abc']をHTMLとして安全に出力したいという処理なのであれば
echo h($_POST['abc']);
で問題ありませんというか、$aに代入するより正しいと言えます。
$a = h($_POST['abc']); //サニタイジングコードをはしょってます
echo $a;
としているのは通常は$_POST['abc']を直接出力するのではなく、
その前後で何らかの処理を行うことを想定して書かれている様に思います。
もしくは、$_POSTをHTMLとして直接出力するのはセキュリティ上とても大きな問題になるため
入力時にサニタイジングすることで最低限のラインのセキュリティを持たせたいという意図かもしれません。
$_SESSIONについては、$_SESSIONをそのまま読み書きしたい(=セッション値として変更されたものを保持させたい)のであればそのまま扱えばいいですし、$_SESSIONを変更したくは無いが$_SESSIONを元にしたデータを加工したいという場合は一度代入するという流れになるかと思います。
直接スーパーグローバル変数を扱わないメリットとしては
0. プログラマに$_POSTや$_SESSIONを直接操作させたくない($_SESSIONに格納される値は統一的に管理したい場合など)、
0. 必ず何らかの処理(要素の検証など)を行ってから扱いたい
0. スーパーグローバル変数の機能を制限/変更したい、例えば$_GETと$_POSTを区別せず同じものとして扱いたい
というような効果を期待して、メインの処理の前に$_POSTや$_SESSIONを変数やオブジェクトに代入して、その後は代入されたものだけをプログラム上で操作する
といったケースもあります。
セキュリティ的な理由で処理の先頭で
入力時にサニタイジングして変数に格納するのはとても微妙で、時として有害にすらなりえます。
理由は
・サニタイジングは出力のタイミングで出力先に合わせて行わなければならない
必要があり、今回のケースだと$aがその後の処理で危険なHTMLに加工されてしまう可能性があるためです。
サニタイズについては
https://www.google.co.jp/search?q=%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA%E8%A8%80%E3%81%86%E3%81%AA&ie=utf-8&oe=utf-8&hl=ja
https://takagi-hiromitsu.jp/diary/20070203.html#p01
あたりをご覧になると必要な処理とタイミングについてつかめると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/22 01:05