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

製作 プログラム

最終更新日:2016/10/03

ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.

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

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

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

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

  1. hrefやsrcのクロスサイトスクリプティング(XSS)対策
  2. 実はこういったjavascriptの実行方法がある!
  3. urlかどうか判定するコードがクロスサイトスクリプティング(XSS)対策に必要
  4. hrefやsrcでは独自関数でもクロスサイトスクリプティング(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内に出力する場合は気にする必要はありません。

【おしらせ、というか完全なる宣伝】

文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.

こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ココア20g / ハイチュウとかってさ / なぜ米と小麦を食べようと思ったのかの謎 /