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

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

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

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

XSS

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

Q&A

解決済

2回答

1600閲覧

XSSでのエスケープについて

t-hoso

総合スコア21

PHP

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

XSS

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

0グッド

1クリップ

投稿2019/04/12 06:36

PHPで作成されたページで、XSS対策としてhtmlspecialcharsによるエスケープ処理はおこなったのですが、脆弱性チェックのソフトにかけたところ、それだけだとjavascript:alert()のようなケースに対応できてないようで、少し悩んでいます。

例えばチェックの結果、以下のような部分で警告が出てきます。

<a href="xxxx.php?sid=javascript:alert(1);&year=2019&mon=4">

みなさまはどのように処理をされているのでしょうか?

ひとつひとつのパラメータに対して正規表現などで細かくチェックをしていくしかないでしょうか。

何か定番的な解決方法があるのであればご教示いただければと思っております。

よろしくお願いいたします。

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

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

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

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

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

tanat

2019/04/12 06:42

> 例えばチェックの結果、以下のような部分で警告が出てきます。 > <a href="xxxx.php?sid=javascript:alert(1);&year=2019&mon=4"> この時のPHPのソースの提示をお願いします。
t-hoso

2019/04/12 07:01

ありがとうございます! 例に挙げた部分は抜粋すると下記のような感じです。 URLパラメータを取得してカレンダーが生成されるページです。 数種類あるセミナーごとにスケジュールが切り替わるようになっていて、GETで取得している「sid」がセミナーごとのID(アルファベット+数値)になっています。 $kidm = $_GET['sid']; $kidm = esc($kidm);//XSS対策 $nowy = date("Y"); $nowm = date("n"); $linkhtml = <<<EOM <ul id="monthList"> <li><a href="schedule.php?kid=$kidm&year=$nowy&mon=$nowm">今月</a></li> ……(以下略) EOM; esc関数は以下の通りです function esc($a) { return htmlspecialchars($a, ENT_QUOTES, "UTF-8"); } よろしくお願いいたします。
ockeghem

2019/04/12 07:08 編集

ぱっと見は脆弱性でない気がしますが、alert() が起動したりしますか?
t-hoso

2019/04/12 07:13

ご回答ありがとうございます。 実際にchromeで試したところはアラートは出ません。 脆弱性チェックのソフトでドバドバーとこのあたりの警告が出てきて怖くなってしまったので 対策が講じられるものなら、講じておきたいと思った次第です。
guest

回答2

0

すでにクローズされてますが参考まで

エスケープ処理って、本質的には「あるシステム系から別のシステム系にデータを渡す際に、渡す先で正しく理解できるデータとして渡す」ことを目的にしています。

ですので、脆弱性の有無というより、正しく動作させるために必要な処理なので、ひとつひとつ正しく渡せる方法を選択する必要があります。

今回だと「php」というシステムから「ブラウザ」へ「html(url)」を正しく渡すことが本質なので、url として正しく理解されるためにurlencode()を使用する。ということになります。

不正アクセス対策という観点だけでなく、本質からチェックするとアプリケーションとしても正しい動作を行うようになるので、ワリと重要な視点だと思います。

参考:
エスケープの必要な処理とは?

投稿2019/04/12 07:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

t-hoso

2019/04/12 08:07

アドバイスありがとうございます。 そうですね、おっしゃる通りだと思います。 今回は、かなり昔に外注で作ってもらった既存のシステムの見直しで急ぎで作業をする必要があり、こんな状態になっていますが、 次のステップとして、きちんと処理をきれいにまとめていきたいと思います。
guest

0

ベストアンサー

URL部分になるのでクエリストリングの値部分にurlencode()をかけます。

php

1echo urlencode("javascript:alert(1);"); 2//javascript%3Aalert%281%29%3B

投稿2019/04/12 06:43

m.ts10806

総合スコア80850

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

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

t-hoso

2019/04/12 07:07

ありがとうございます! 恥ずかしながらurlencodeは初めて知りました。 ぴったりな回答でした。 本当に助かりました。ありがとうございます!
m.ts10806

2019/04/12 07:19

urlエンコードも確かに必須ですが、パラメータ受け取った先でhtmlエスケープするのも忘れないようにしてくださいね
t-hoso

2019/04/12 07:42

ありがとうございます。 そちらはとても気を付けているつもりですが、再度見直してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問