Blog

XSS(クロスサイト・スクリプティング)

2014.09.09Cat:PHP プログラマー

概要

通常、WEBアプリケーションには外部からの入力などに応じて表示が変化する箇所があり、この部分のHTML生成の実装に問題があると、悪意のあるjavascriptコードをHTMLやCSSに埋め込まれ、XSSという脆弱性が生じます。

WEBアプリケーションにXSS脆弱性がある場合には、以下の影響があります。

  • サイト利用者のブラウザ上で、攻撃者の用意したスクリプトの実行によりクッキー値を盗まれ、成りすましの被害にあう。
  • ブラウザ上で、スクリプトを実行させられ、サイト利用者の権限でWEBアプリケーションの機能を悪用される。
  • WEBサイト上に偽の入力フォームが表示され、フィッシングにより利用者が個人情報を盗まれる。

対策

HTML文字参照によりエスケープする

外部から入力された文字列を表示する直前にhtmlspecialchars()関数でエスケープします。

こうすると、<は&lt;に、>は&gt;に、&は&amp;に、”は&quote;に、’は&#39;に変換されます。

htmlspecialchars()関数の第2引数は必ずENT_QUOTESを指定します。これを使用しないとシングルコーテーションが変換されず、脆弱性が残る可能性があります。属性値については、ダブルコーテーションで囲んでエスケープします。

 

HTTP レスポンスヘッダーに文字コードを指定する

HTTP のレスポンスヘッダーのContent-Type フィールドには、「Content-Type: text/html; charset=UTF-8」のように、文字コード(charset)を指定します。

HTML の META タグでも、Content-Type で charset を指定できますが、ブラウザの挙動に依存するため、確実に正しい文字コードで表示できるように、HTTP のレスポンスヘッダーで文字コードを指定するようにします。

 

URL は「http://」か「https://」で始まるもののみ出力する

URL は 「http://」や「https://」だけでなく、JavaScript を実行できる「javascript:」という記述もできます。スクリプトが注入されないように、URL は「http://」と「https://」から始まるもののみ出力します(ホワイトリスト方式)。正規表現などでURLかどうかチェックするのが望ましいです。

 

javascript要素の内容を動的に生成しない

<script></script> 要素内容の動的な生成は、安全な形でエスケープするのは非常に難しいため、動的に生成しないようにしてください。

Author Profile

  • Launch Cart次世代ECサイト構築システム 初期月額無料
  • LaunchMovie ECに特化した動画制作サービス

Archive

ページTOPへ