hrefやsrcに含まれる特殊文字はエスケープしなくて安全?必要?

製作 プログラム

2016/08/23(火)

XSS対策のためエスケープ処理は万全に!

クロスサイトスクリプティング(XSS)攻撃とは悪さをするプログラムを対象のサイトに埋め込む攻撃のことです。例えば掲示板なんかの入力フォームにjavascriptのプログラムを入力して、パソコンに保存されているパスワードを不正に手に入れたりします。

入力フォームとその入力された内容を表示する仕組みさえなければ、例えばコメント機能のないブログなんかだとクロスサイトスクリプティング(XSS)攻撃恐れるに足らず!なのですが、だいたいのウェブサイトでは入力フォームがあって、入力内容の表示もしちゃっています。

そんなXSS対策のために必要なのがエスケープ処理。エスケープ処理はそれがあるとパソコンがプログラムと認識してしまう特殊文字(『<』とか『.』とか)を文字参照という無害な文字に変換する処理です。エスケープ処理をすることでパソコンは入力された悪いソースコードをプログラムじゃなくてただの文字列と認識するようになり、プログラムが実行されなくなります。

今回はちょっとマニアックですが、urlについてもエスケープ処理する必要があるのか記事にしています。エスケープ処理って特殊文字を文字参照という違う文字に変換する処理。urlに含まれる特殊文字を違う文字に変換してもちゃんと正しくリンク先に飛べるのか気になりますよね。

urlに含まれる特殊文字をエスケープ

まず一番気になるエスケープされた参照文字が含まれたurlでもちゃんとリンク先に飛べるのか、を書きますね。a要素のhrefやimg要素のsrcなどurlにエスケープされた特殊文字が含まれていてもちゃんとリンク先に飛んでくれます。

言葉にするより見てもらったほうがわかりやすいと思うので以下の例を見てください。

どっちもユニクロに飛ぶURLでその中に『&』を含んでいます。ブラウザ上の見た目は同じ『&』ですが、ソースコードを表示してもらうと、下の方は『&amp;』になっていることがわかりますので確認してみてください。(クロームだとctrl+U)

そもそもhrefやsrcのエスケープ処理は必要?

次にそもそもhrefやsrcの中に出力する値はエスケープ処理が必要なのでしょうか。

エスケープ処理

エスケープ処理はユーザーが入力フォームに打ち込んだjavascriptのプログラム等を無害化するために行います。つまりXSS対策で行うもの!

「ふむふむ、エスケープ処理はjavascriptの無害化が目的なのか。」次に、

hrefやsrc内のスクリプトは実行されない

aタグの中のhrefやimgタグのsrc内に<script></script>が挿入されても、あくまでもurlとしてで生のhtml文ではないので実行されません。

「ん?javascriptが実行されないならそもそもhrefやsrcに対してはエスケープ処理しなくてもいいのでは?」と感じますよね?その点を少し詳しく見ていこうと思います。

以下のようなphpを書いていた場合を例にしてみますね。

php


<a href="<?php echo(ユーザーが入力した値); ?>">リンク</a>

この「ユーザーが入力した値」の部分が

php


\"><script>alert('error');</script>

上のようないやらしい入力だとした場合、実際に出力されるのは以下になります。

php


<a href=""><script>alert('error');</script>">リンク</a>

想定していたaタグがユーザーの入力した閉じタグによって閉じられてしまい、javascriptがむき出しになっちゃっています。こうなるとjavascriptが生のhtml上に存在することになり普通に動き出してしまいます。

やっぱりhrefやsrcについてもエスケープ処理は必要です。

urlもちゃんとエスケープ処理をしよう!

ということでhrefやsrcのようなurlもちゃんとエスケープ処理をしましょう。

ただやることは特別なことではありません。

クロスサイトスクリプティング(XSS)対策では、データベースに保存した文字に対しphpに標準で搭載されているhtmlspecialchars()関数を用いて特殊文字のエスケープをします。一番上で書いたようにurlや画像のパスにエスケープ後の文字が含まれても問題なくリンクできるので、「これはurlだから他のエスケープ処理を自分で作らないと…」などと気にせず、htmlspecialchars()関数をいつもどおり使うだけです。

url特殊文字のエスケープまとめ

  • hrefやsrcにエスケープされた特殊文字が含まれていても大丈夫
  • XSS対策のためhrefやsrcもちゃんとエスケープ処理すること

urlへのクロスサイトスクリプティング(XSS)対策はコレも気にしよう

hrefやsrcなどのurlに含まれる特殊文字はエスケープしてもちゃんとリンク先に飛んでくれますのできちんとhtmlspecialchars()関数を用いて無害化しましょう。

ただhrefやsrcに関しては、クロスサイトスクリプティング(XSS)対策をする上で、さらにもう一つ気をつけないといけない点がありますので次の記事(hrefやsrcのXSS対策)で紹介していきますね。