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

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

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

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

XSS

XSS【クロスサイトスクリプティング】は、 ソフトウェアのセキュリティホールの一つで、Webサイトに脆弱性が あることからその脆弱性を利用し攻撃する手法です。 主に、入力フォームなどから悪意あるスクリプトを挿入し 該当ページを閲覧したブラウザ上でそのスクリプトを実行します。

Q&A

解決済

4回答

2617閲覧

get送信値に対するXSS対策について

shogo_misaki

総合スコア13

PHP

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

XSS

XSS【クロスサイトスクリプティング】は、 ソフトウェアのセキュリティホールの一つで、Webサイトに脆弱性が あることからその脆弱性を利用し攻撃する手法です。 主に、入力フォームなどから悪意あるスクリプトを挿入し 該当ページを閲覧したブラウザ上でそのスクリプトを実行します。

0グッド

3クリップ

投稿2017/10/31 02:59

編集2017/10/31 03:48

入力フィールドに値を入れてpost送信を行い送信先でCSVに1行ずる加筆する簡易フォームを作成しました。
こちらのフォームに対してブラウザのXSSフィルタを外し、URLに

http://xxx.com/index.php?"><body/onload=alert(test)>

とするとJSアラートが表示されるためXSS対策を行う必要があります。
get値に関しては特に利用していないので冒頭に

php

1if (!empty($_GET)) { 2 foreach ($_GET as $k => $v) { 3 $k = $this->xss($k); 4 $v = $this->xss($v); 5 } 6} 7 8if (!empty($_GET["count_push"])) { 9// ajaxで本ページにgetパラメータを付与した状態でアクセスした際、テキストファイルに1を付与する処理 10} 11 12function xss($str = null){ 13 return htmlspecialchars($str,ENT_QUOTES, "UTF-8"); 14}

上記のような処理をいれてみましたが、XSSフィルタ外したブラウザで確認するとalertが動いてしまいました。
どのような処理がを行えば正しくget値に対してXSS対策ができるでしょうか。

ご教授お願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

非常に興味深い事例です。"><body/onload=alert(test)> というクエリ文字列でXSSとなったということのようですが、このクエリ文字列は、

キー: "><body/onload
バリュー: alert(test)>

と解釈されるからです。onloadとalertの間に = があるためにそうなります。
このような入力でXSSになるパターンは、まったくないわけではなく、URLあるいはクエリ文字列全体を生の形で属性値に保持するような場合ではありえます。

今後の切り分けの方法としては、XSSを再現させた状態でそのHTMLソースを確認して、"><body/onload=alert(test)> の一部あるいは全部がどこかにあるはずなので、それがどの箇所で表示されているかを手がかりに分析するとよいと思います。

投稿2017/10/31 14:15

ockeghem

総合スコア11701

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

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

shogo_misaki

2017/10/31 14:27

ソースを確認したところ、「$_SERVER["REQUEST_URI"]」をechoしている箇所があったのですが、そこに件のソースが出力されていました。 このクエリを投げられると$_GETのみならず$_SERVERに影響してしまうようですね。。 なので、グローバル変数を使わずjavascriptで既存ページのURLを取得する様に変更したところ、発火されなくなりました。 こうなると実際他グローバル変数にどれだけ影響するのかもきになるところですが詳しくは追えてません。。 取り急ぎお礼まで、ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/10/31 14:53

横からすみません。結論に大変興味があります。 $_SERVER["REQUEST_URI"] だとパーセントエンコードされてませんか? その場合、アラート上がらないと思うんですが、実際どういったコードだったのでしょう?
ockeghem

2017/11/01 03:20

IEだとパーセントエンコードされません。Edgeはパーセントエンコードされます
退会済みユーザー

退会済みユーザー

2017/11/01 03:23

そうなんですね。勉強になります。 今環境がないんであとで試してみます。 ありがとうございました!
退会済みユーザー

退会済みユーザー

2017/11/01 04:04

今、確認しました。IE、すごいですね。 無事(?!)アラートが上がりました。
guest

0

get値に関しては特に利用していないので

とありますが、本当に利用していないのであればXSSは発生しません(極論、「JavaScriptもPHPもない、単なるHTML」に妙なクエリを付けてもXSSは起きません)。

  • $_REQUESTでGET、POSTをまとめて参照してしまっている
  • JavaScriptでlocationから値を抽出している
  • フレームワーク内で参照して、デバッグ用に値を出力している

など、どこかで使っているはずなので、まずはそれを突き止めるのが先決です。

投稿2017/10/31 03:26

maisumakun

総合スコア145183

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

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

shogo_misaki

2017/10/31 03:39

一点だけ修正です。 該当ページに対してとあるgetパラメータがついていたら特定の処理(ただしgetパラメータに格納された値は利用しない)は存在しました。 if (!empty($_GET["count"]) { $this->hoge(); } ご指摘の$_REQUSETもlocationもフレームワークも使用していない状態です。 それでもURLに冒頭のパラメータを付与するとalertが表示されます。 こちらを解消したいです。
maisumakun

2017/10/31 04:00

とりあえず、部分的にしかソースがないので、「残りの何処かに問題があるのだろう」以上のことはいえません。
maisumakun

2017/10/31 04:12

ちなみに、「foreach ($_GET as $k => $v)」で回した場合、$kや$vはコピーなので、どれだけ書き換えても元の$_GETは変化しません。
guest

0

php において、もっとも一般的な XSS 対策は HTML 表示の際に表示データを「text/html な内容」に変換することです。
「何故htmlspecialcharsを通すのか?」を一言でどうぞ

フレームワークを使用していれば、どこかで上記を実施する機構が用意されているので探してみてください。

追記
サンプルスクリプトを追記します

対応版

php

1<script type="text/javascript"> 2var test = 'hoge' 3</script> 4<?php 5$in = '><body/onload=alert(test)>'; 6echo htmlspecialchars($in, ENT_QUOTES, 'UTF-8');

非対応版

php

1<script type="text/javascript"> 2var test = 'hoge' 3</script> 4<?php 5$in = '><body/onload=alert(test)>'; 6echo $in;

投稿2017/10/31 03:34

編集2017/10/31 04:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shogo_misaki

2017/10/31 03:43

表示データに関して(post送信で受けわたすデータに関して)はxss処理としてxss関数を通すようにはしています。 フレームワークなどは利用していないプレーンなphpで、入力画面→完了画面(完了画面冒頭でCSVへ書き込む処理)をしているシンプルなもので、 入力画面に対してgetパラメータに対して冒頭の値を付与してアクセスするとalertが動いてしまう件に関して対応を行いたいんです。
退会済みユーザー

退会済みユーザー

2017/10/31 04:21

回答にも書きましたが、HTML 表示する際に「text/html な内容」に変換することが対応策です。 サンプルスクリプトを回答に追記します。
guest

0

提示されている「URL」がフォームに入れた内容ならば、確認するのはGETでなくPOSTです。
「URL」がフォームのURLにパラメータとしてつけたものであれば、ソースを表示してどこ挿入されたか確認してみては。

投稿2017/10/31 03:50

kei344

総合スコア69407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問