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

This page is a translated version of the page Cross-site scripting and the translation is 82% complete.

クロスサイト スクリプティング (cross-site scripting)、XSS任意の JavaScript 注入 (arbitrary JavaScript injection) とは、ウェブ アプリケーションに典型的に見られるコンピューター セキュリティの脆弱性の一種であり、攻撃者が他の利用者が閲覧するウェブ ページにクライアント側スクリプトを注入できるものです。

クライアント側でのクロスサイト スクリプティングとその防止策については、DOM-based XSS を参照してください。

クロスサイト スクリプティングの例:

  • 攻撃者は、認証済みの利用者を騙して、特別に細工された URL や、攻撃者が制御するウェブサイトにアクセスさせ、細工された URL にリダイレクトさせることができます。
  • URL はウェブ アプリを指しており、クエリ文字列には JavaScript が含まれています。ウェブ アプリは、エスケープが不十分なため、利用者に表示するページに任意の JavaScript を注入します。
  • JavaScript は利用者のクッキーにフルアクセスして作動します。ページの改変はどのようにもでき、利用者に代わってフォームを示すことができます。非攻撃者が特別な権限を預かる管理者である場合、リスクは非常に重くなります。

その他の例についてはウィキペディアの記事 Exploit の例を参照してください。

例:

function getTableCell( $out, $value ) {
    $request = $out->getRequest();
    $class = $request->getVal( 'class' );
    return "<td class='$class'>" . htmlspecialchars( $value ) . '</td>';
}

攻撃者は非攻撃者を次のような特定のURLに誘導します。

http://example.com/wiki/SomePage?class='%20><script>hack();</script></td><td%20class='

POST(投稿)リクエストもリスクを帯びるのは、オフサイトの JavaScript を利用する場合です。

直接、当該のページを開かなくても影響は非攻撃者に及びます。悪意のある第三者によるウェブサイトは、URLに巧妙に不可視の iframes を組み込み、当該のウェブサイトを開いた利用者を攻撃します。また短縮URLサービスを介する、またはURLの偽造により、悪意のあるまたは細工したサイトに誘導される可能性もあります。

クロスサイトスクリプティングの停止

クロスサイト スクリプティングを回避するため、以下を行なってください:

  • 入力内容を検証
  • 出力内容をエスケープ

You can skip validation, but you can never skip escaping. Escape everything.

It does not matter if the escaping is redundant with the validation, the performance cost is a small price to pay in exchange for a demonstrably secure web app. It does not matter if the input comes from a trusted source, escaping is necessary even then, because escaping gives you correctness as well as security.

Escape as close to the output as possible, so that the reviewer can easily verify that it was done. It helps you to verify your own code as well.

Output encoding (escaping) is context sensitive. So be aware of the intended output context and encode appropriately (e.g. HTML entity, URL, JavaScript, etc.)

The OWASP Abridged XSS Prevention Cheat Sheet is a useful and up to date quick reference guide for mitigating XSS issues.

All this is true of any text-based interchange format. We concentrate on HTML because web apps tend to generate a lot of it, and because the security issues are particularly severe. Every text format should have a well-studied escaping function.

Here are some convenience functions which do HTML escaping for your site.

書式 エスケープ関数 注記
HTML htmlspecialchars( $string, ENT_QUOTES ) 常に ENT_QUOTES フラッグを立ててクオート符号はダブルもシングルもダブルも変換させます。残念ながら PHP は既定では「シングルクォートのみエスケープ」するからです。[1]
XML ID Sanitizer::escapeId() HTML の id 属性用
CSS Sanitizer::checkCss() HTML の style 属性用
JavaScript FormatJson::encode(), Xml::encodeJsVar()
URL パラメーター wfArrayToCgi(), urlencode()
SQL $db->addQuotes()

MediaWikiエスケープ出力

MediaWiki にはスマートな組み込み型のインタフェースがあり、暗黙的に利用者の出力をエスケープします。SQLが条件の 'key' => 'value'構文を使用する場合、暗黙的に値をエスケープします。そして、Html::とXml::インターフェイス方式は属性をエスケープし、使用する方式によって文字列の値もエスケープする場合があります。

外部リンク

脚注