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

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

ただいまの
回答率

91.35%

  • PHP

    15175questions

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

header() 使用時のhtmlspecialchars()について

解決済

回答 1

投稿 2017/11/25 14:46 ・編集 2017/11/25 14:49

  • 評価
  • クリップ 1
  • VIEW 60

yy_hatena

score 1

PHP初心者ですが、ご回答頂ければ幸いです。
どうぞ宜しくお願い致します。

只今、header()関数を用いて、別ページに移動するプログラムを制作しております。
そこで、例えば下記のようなコードでページを移動させようとする場合...

//htmlspecialchars適用
public function TEXT_CHECK($var){
    return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
}

//別ページ移動
private function TEST(){

    //これか
    $this->url = 'https://www.example.com/?test1=abc&test2=def';
    //またはこれ
    $this->url = 'https://'.$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"] ;
    //...として    

    header('HTTP/1.1 303 See Other');
    header('Location: '.$this->TEXT_CHECK($this->url));
    exit ;

}

移動先ページのブラウザURLが、

https://www.example.com/?test1=abc&test2=def


イメージ説明
と表示され、文字参照となりページは表示されないのですが、

<質問1>
この場合、header()のLocationに指定したURLには、htmlspecialchars()を適用しないものでしょうか?また、HTMLだと「&」は「&」と認識されると思うのですが、URLの場合はどうなるのでしょうか?

<質問2>
また、$_SERVERで取得した値は、どのように扱うのがセキュリティ強化に繋がるでしょうか?
$_SERVERで取得した値を、htmlspecialchars()を通さず直接使用するというのが、どこか不安を感じるもので...

<質問3>
別ページに移動するプログラムを制作するとき、皆様はどのような点に気をつけながら制作しますか?

そもそもな、的外れ的な質問だとしたら申し訳ございません...
どうぞ宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+3

<質問1>
この場合、header()のLocationに指定したURLには、htmlspecialchars()を適用しないものでしょうか?また、HTMLだと「&」は「&」と認識されると思うのですが、URLの場合はどうなるのでしょうか?

htmlspecialchars()は適用しません。適用するのは間違いです。
その理由は、Locationヘッダの内容は単なるテキストであり、HTML形式ではないからです。

<質問2>
また、$_SERVERで取得した値は、どのように扱うのがセキュリティ強化に繋がるでしょうか?
$_SERVERで取得した値を、htmlspecialchars()を通さず直接使用するというのが、どこか不安を感じるもので...

$_SERVERで取得した値は一般的に信頼できないので、「信頼できない値」として扱うのが正しいです。Locationヘッダで htmlspecialchars()を通すのは間違いですが、HTML内に表示する場合はhtmlspecialchars()は必須です。また、SQLクエリーの際にはSQLインジェクション対策は必須です。このように、文脈に応じて必要な処理は変わります。

<質問3>
別ページに移動するプログラムを制作するとき、皆様はどのような点に気をつけながら制作しますか?

Location ヘッダに通す際は、以下が重要となります。

  • ホスト名が意図した値かどうかを確認する。できれば、$_SERVERから取得せずハードコーディングした方がよい。
  • URLをスクリプト内で組み立てる際はパーセントエンコードを忘れないこと。$_SERVER["REQUEST_URI"]をそのまま使う場合は既にパーセントエンコードされているはずなので、二重にパーセントエンコードする必要はない
  • URL内に改行がないか。$_SERVER["REQUEST_URI"]を使う場合は改行はないはずだが、念のため確認してもよい。URLをアプリケーション内でで組み立てている際は改行チェックは必須

これら以外にアプリケーション特有の注意があるかもしれませんが、それはアプリケーションの仕様が分からないとなんとも言えません。

投稿 2017/11/25 16:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/25 18:20

    早速のご回答を頂き、ありがとうございました。
    >> Locationヘッダの内容は単なるテキストであり、HTML形式ではないからです。
    が、とても分かりやすく、疑問が解決致しました。ありがとうございました。

    また、Location ヘッダに通す際の重要事項も大変参考になりました。

    また一つ知識を得ることが出来ました。
    初心者のつたない疑問にお答え頂き感謝です。

    今後とも、どうぞ宜しくお願い致します m(_ _)m

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • PHP

    15175questions

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