• ベストアンサー

PHPのフォームでPOSTした変数を自動で変数に

$server = $_POST['server']; $domain = $_POST['domain']; $domainmail = $_POST['domainmail']; $news = $_POST['news']; このように、フォームからPOSTした情報を毎回変数に格納する記述をしているのですが、複数のPOSTデータのnameをそのまま変数にし、セキュリティにも配慮して情報を格納させて扱う方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

あれ、さっきの質問は閉めたのですね。さっきのNo1です。 extractは$_GETや$_POSTに対して使ってはいけません。リファレンスにも書いてあるのですが。 http://php.net/manual/ja/function.extract.php >extract() をユーザー入力 ($_GET や $_FILES など) のような信頼できないデータについて使用しないでください。 理由がわからなければそこにある register_globals のリンク先のページを読むこと。つまり、$_POST を全部(個別に"server"とか"domain"とかを指定しないで)変数に展開するのはセキュリティリスクになります。 あと、セキュリティには、 ・入力時にサニタイズ ・使用時にエスケープ という2つの考え方があります。入力時にサニタイズの方が楽なので、そう書いてあるドキュメントが多いのですが、あるデータを、ファイル名にも使うし、HTMLにも出力するし、JavaScriptのデータとしても出力するなど複数種類に使うことを考えると、サニタイズという考え方に限界があることがわかります。 使用時にエスケープというのは、たとえば、データをhtml内のテキストとして出力するときは必ずhtmlspecialcharsを使うとか、sql文を組み立てるときにはDBに応じてescapeする関数を使うとか(プレースホルダを使うのがより良い)、ファイル名として使うときにはファイル名に使えない文字を変換するとかなどなど。 ・入力時にサニタイズ => 入力時にデータを清浄化処理してあとはデータはきれいと考えるやり方 ・使用時にエスケープ => すべてのデータは汚染されていると考えるやり方 つまり、使用時にエスケープ前提で、さっきの私の回答でOKです。

agb55434
質問者

お礼

なるほど、データの用途に応じて洗浄の仕方があるのですね、ありがとうございます。 もともとプログラマでなくエスケープ処理自体も知りませんでした。 そこまでのヒントを頂けるととても時間の短縮になりました。 ありがとうございます。

その他の回答 (1)

  • bakaok
  • ベストアンサー率22% (33/148)
回答No.2

>そう書いてあるドキュメントが多いのですが、あるデータを、ファイル名にも使うし、HTMLにも出力するし、JavaScriptのデータとしても出力するなど複数種類に使うことを考えると、サニタイズという考え方に限界があることがわかります。 それが#1の限界と言うことです。 ソースや仕様の段階でどうにでもなる。 それと >データをhtml内のテキストとして出力するときは必ずhtmlspecialcharsを使うとか、sql文を組み立てるときにはDBに応じてescapeする関数を使うとか(プレースホルダを使うのがより良い)、ファイル名として使うときにはファイル名に使えない文字を変換するとかなどなど。 こっちのエスケープとは別物として考えるべき事。 だからこそ入力時と使用時両方でやる必要がある。 でソースとして書くなら $_POSTを別の配列にコピーして その配列をベースにしてエスケープ処理をする。 その後その配列からextract()を利用する。

関連するQ&A