htmlのhrefやsrcのクロスサイトスクリプティング(XSS)対策

製作 プログラム

2016/08/23(火)

hrefやsrcのクロスサイトスクリプティング(XSS)対策

前回に引き続きaタグhrefやimgタグのsrc内にユーザーの入力した値を入れる場合のクロスサイトスクリプティング(XSS)対策についてです。

前回はhrefやsrcの中にエスケープされた文字(&等)があってもちゃんとリンク先に飛ぶこと、そしてhrefやsrc内であってもエスケープ処理は必要だということを紹介しました。(前回の記事:hrefやsrcに含まれる特殊文字のエスケープについて

今回はさらにhrefやsrcといったurl欄において特別に注意しないといけないクロスサイトスクリプティング(XSS)対策を紹介します。

実はこういったjavascriptの実行方法がある!

実は<script></script>で実行するほかにもjavascriptを実行させる方法があります。下の書き方でもjavascriptが動きます。

php


<a href="javascript: alert('へぇ~!');">へぇ~ボタン</a>

この書き方はhrefやsrc内といったurl、リンクを表す部分でのみ有効な書き方ですのでその他のhtmlで出力するときは気にしなくていい部分となります。

urlかどうか判定するコードがクロスサイトスクリプティング(XSS)対策に必要

なのでhrefやsrcでのみ行わなければならないクロスサイトスクリプティング(XSS)対策が必要となります。

phpでは標準でurlかどうか判断する関数は用意されていないので自分でコードを用意する必要があります。よく紹介されているコードはこんな感じです。

php


function isUrl($url) {
    return (boolean)preg_match('/A(https?://|/)/',$url);
}

『isUrl($調べたい文字列)』といった使い方をします。

調べたい文字列の先頭がhttpで始まっていてさらにsが0~1回繰り返され、さらにその後に://があればurlだと判断するコードとなっています。

hrefやsrcにユーザー入力の文字列を出力する前には、こういったコードで本当に出力しようとしている文字列がurlなのか、上で書いたような悪意のあるプログラムなのか判断しましょう。

またisUrl()を用いた判定に加えて前回の記事で紹介したhtmlspecialchars()関数を用いたエスケープ処理も別途必要です。

hrefやsrcでは独自関数でもクロスサイトスクリプティング(XSS)対策を

ということでaタグのhrefやimgタグのsrc等、urlにユーザー入力した値を挿入する場合はhtmlspecialchars()関数を用いたエスケープ処理のほか、特別にそれが本当にurlなのかどうか判定するクロスサイトスクリプティング(XSS)対策も必要となることがわかりました。

繰り返しになりますがhrefやsrcなどのリンク先となる部分にのみ特別に必要な処理で通常のhtml内に出力する場合は気にする必要はありません。