クロスサイトスクリプティングとスクリプトインジェクションの違い
スクリプトインジェクションとは
スクリプトインジェクションは、攻撃者がJavaScriptやVBScriptなどを他人のホームページの内容に挿入することで、ホームページを訪問したユーザに対して、悪意あるスクリプトを実行させるというアタック方法です。「script insertion」は直訳すると「スクリプト挿入」のことです。
攻撃される場所
このアタックは、ブログのコメントや掲示板などであらゆる文字を自由に入力できるフォームで見受けられます。
攻撃が成立すると
アタックが成立してしまうと、cookieなどのデータが取り出され、管理者権限を与えてしまったり、悪意あるサイトに飛ばされ、ウィルスに感染させられたりします。
対処法
スクリプトインジェクションは出力時にエスケープして対応します。そうすることで悪意あるコードを入力されてもそれを無効化することができます。
htmlspecialchars()
PHPでエスケープする書式例は、「htmlspecialchars(対象文字列, ENT_QUOTES, 'UTF-8');」です。これで「"」「'」「&」「<」「>」がそれぞれ文字参照の表記へと置き換わります。似たような構文に「htmlentities()」というものもありますが、こちらは上記五つ以外の文字も変換してしまうため、一般には「htmlspecialchars()」の構文が使われることが多いようです。
ENT_QUOTES
また、htmlspecialchars()はそのままだとシングルクォートはエスケープされません。そのため、第二引数で「ENT_QUOTES」を指定してシングルクオートとダブルクオートを共にエスケープさせます。
第三引数の文字セット指定
第三引数は環境によって異なりますが、PHP5.5以前のバージョンを除けば、技術的には省略可能です。
クロスサイトスクリプティングとは
クロスサイトスクリプティング(以下、XSSと表記します。)はスクリプトインジェクション攻撃と同じく、悪意あるスクリプトを実行させるという攻撃方法です。
XSSとスクリプトインジェクション攻撃の違い
XSSは間接的に悪意のあるコードを実行させるのに対して、スクリプトインジェクションは直接、攻撃対象のホームページに悪意あるコードを注入する点が異なります。つまり、XSSでは対象のホームページとは関係の無いサイトやメールなどを間接的に踏み台にしてアタックしてきます。
XSSと表記される由来
XSSは、「Cross Site Scripting」のことですので、本来頭文字をとって省略すれば、「CSS」となります。これは「Cascading Style Sheets」との混乱を避けるために区別されているようです。
対処法
スクリプトインジェクションの場合と同様です。出力時にエスケープすることで対策します。