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

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

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

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

Q&A

解決済

2回答

3428閲覧

PHP スーパーグローバル関数を上書きしてはいけない?

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2018/02/26 05:33

質問内容はシンプルなのでそのまま記述します。

phpにてエスケープしたいとき、htmlspecialcharsを使わなければいけないとおもっていました。

PHP

1<?php echo htmlspecialchars($_POST['name']); ?>

ただ$_POST/$_GETなどは上書きしてはいけないということもあるみたいなので上記コードを表示する箇所全てに表示するという事態になりかねません。
ただ同時に$_POST/$_GETは直接アクセスしない方がいいということもあり、どう使えばいいのかわからなくなってしまいました。

$_POST/$_GETはどのように使うのが正しいのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

phpにてエスケープしたいとき、htmlspecialcharsを使わなければいけないとおもっていました。

それは間違いないですが、

php

1<?php echo htmlspecialchars($_POST['name']); ?>

は**$_POST['name']に格納されている値に対してhtmlspecialchars()を掛けて画面出力する**記述であり、$_POST['name']自身が変化しているわけではありません。

上記コードを表示する箇所全てに表示するという事態になりかねません。

「表示する箇所全てに表示する」というのは「表示する箇所全てにhtmlspecialchars()」をかけるという意味でいいですかね?
htmlspecialchars()は基本的に画面出力する際にかけるものなので、基本的には、そうです。

一応、$_POST["test"] = "hogehoge";のようにしてSUBMITされていない情報を設定したり、SUBMITされた情報を上書きするのも可能ではありますが、私はそういう使い方をしたことがありません。
$_POSTの値を直接参照したくないのであれば、一度何かしらの変数で受けて、その変数に対して色々処理を施していく、というのが通常の運用方法かと思います。
もし「全箇所にかけなければならない」という懸念があるのでしたら、$_POSTをそのまま別の変数に受け取っておき、foreachで回して全てにhtmlspecialchars()を掛けた上で、その変数を画面出力に利用すれば良いと思います。

php

1$post_vars = $_POST; 2foreach($post_vars as $key=>$value){ 3 $post_vars[$key] = htmlspecialchars($value); 4} 5 6echo $post_vars["test1"]; 7echo $post_vars["test2"];

というので、正確には

phpにてエスケープしたいとき、htmlspecialcharsを使わなければいけないとおもっていました。

phpにて**「画面出力時にエスケープしたい情報に対してhtmlspecialcharsを使う」**が正しい理解です。

投稿2018/02/26 05:46

編集2018/02/26 05:59
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2018/02/26 05:51

つまり上書きというのは$_POST/$_GETなどに別の値を代入するということなんですね! となると $post_name = $_POST['name']; は上書きではないですね!多分ここを勘違いしていました。
m.ts10806

2018/02/26 05:57

説明不足があったので追記しました。 > $post_name = $_POST['name']; $変数 = ○○; はあくまで「$変数という変数に○○を代入する」だけです。右辺(この場合、$_POST['name'])は何も変化しません。 ↓のように実際に色々やってみると良いですよ。 $post_name = $_POST["name"]; echo $post_name; echo $_POST["name"]; $post_name .= "hogehoge": echo $post_name; echo $_POST["name"]; $_POST["name"] .= "fugafuga": echo $post_name; echo $_POST["name"];
退会済みユーザー

退会済みユーザー

2018/02/26 06:04

丁寧な説明ありがとうございます! 僕が引っかかっているのはこちらの記事なのですが、 https://goo.gl/bHV7ZS foreachも用いてエスケープしている部分ですが、これは代入ではなく上書きしてしまっているということですよね?
m.ts10806

2018/02/26 06:07

その方の記事はよく参考にさせていただいてますし、提示の記事も読んでいます。 「絶対に書いてはいけません。」と書いてありますし、その理由や本来すべきやり方も書いてありますが、 どこに引っかかったのでしょうか?
m.ts10806

2018/02/26 06:11 編集

あー、そういえば > このように、出力先にかかわらず、エスケープは必ず、出力を行うその時点で行います。 ですね。確かに私が提示したサンプルソースのように全てpostを受けておいて先にhtmlspecialchars()を掛けておくやり方もありますが、「すぐ画面出力する前提」でないと本来はやるべきではないですね。 出力箇所から遠いと何かしら加工が入る可能性がないわけでもないですし。 もし全てに書くのが面倒なのであれば、テンプレートエンジンやフレームワークを導入するというのも1つの手です。
退会済みユーザー

退会済みユーザー

2018/02/26 06:12

すいません、僕の勘違いでした、 エスケープするためにforeachを用いて$_POSTを代入してはいけないのだと思っていました。 foreachの中身を僕があまりみていなかったので勘違いが発生しました。
m.ts10806

2018/02/26 06:13

なるほど。ソースコードも関連する記事もきちんと読み込んで意味を理解するのは大事ですね。 がんばってください。
guest

0

気になるようであれば変数に受けておけばよいでしょう

PHP

1$name=filter_input(INPUT_POST,"name");

投稿2018/02/26 06:06

yambejp

総合スコア114779

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問