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

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

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

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

2回答

3809閲覧

phpの$_SESSIONや$_POST.GETはそのまま使えるのですか?

yoyoyoyogi

総合スコア47

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

1クリップ

投稿2015/08/22 00:18

PHP初心者です。
入門書などでは

$a = h($_POST['abc']); //サニタイジングコードをはしょってます
echo $a;

と教わるのですが、
実践では

echo h($_POST['abc']);

と書かれる事は多いのでしょうか?

同じく$_SESSIONも

echo $_SESSION[''];

foreach($_SESSION[] as value;

なんて書いても動きますが、変数に代入するのと、どちらが良いのでしょうか。

sessionやpostなどを一度変数に代入するorしないのメリット・デメリットがイマイチ理解出来ていません、教えて頂けれるとありがたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

・HTMLエスケープは、ブラウザが解釈する際に発生する問題を防ぐ目的で行う
・変数は内容が変更される可能性がある
∴HTMLエスケープは、まさに出力時に行うべき
です。

その意味では

$a = h($_POST['abc']); echo $a;

こう書くのは間違っています。

echo h($_POST['abc']);

あるいは

$a = $_POST['abc']; echo h($a);

と書くべきです。

sessionやpostなどを一度変数に代入するorしないのメリット・デメリット

値を編集したり何度も使う場合(値のチェックをし表示もするなど)には変数に代入しましょう。受け取った値をそのまま出力するだけなら、代入しなくてもいいでしょう。ただし、例えば5つ値があって4つは必要があって変数に代入している場合、統一のために代入してもいいでしょう。また、将来表示以外にも使うかもしれない場合などにも代入してもいいでしょう。

投稿2015/08/22 00:59

miu_ras

総合スコア902

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

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

yoyoyoyogi

2015/08/22 01:05

ありがとうございました。 とても勉強になりました。
guest

0

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 00:58

tanat

総合スコア18711

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

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

yoyoyoyogi

2015/08/22 01:05

ありがとうございました。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問