Entry Point Regulation とは
反射型XSS・XSSI・CSRFのリスクを軽減するユーザエージェント上の仕組みとして、W3CでEntry Point Regulationという仕様が策定中です。
Webアプリケーションの口(Entry Point)に幾つかの制限をかけることが出来ます。別オリジンからのリクエストの時に、クエリパラメータやHTTPリクエストボディ(POSTメソッド)が付いていればブロックする、と言った事がマニフェストで指示できるようになりそうです。
EPRにおけるリクエストカテゴリ
各エンドポイント(URL)はどのようなリクエストを受け付けることが可能か指定できます。その時に指定するリクエストは以下に分類されます
- navigational request:context frame typeは"top-level", "auxiliary", "nested"のどれかである。 Navigational requestsはコンテキストにリソースの読み込みを行い、レンダリングを行います。XSSやCSRFのリスクが有ります。
- subresource request:context frame typeは"none"である。、Subresource requestsは直接的にコードの実行を行いません。そのため、XSSのリスクは最小です。しかしCSRFやXSSIのリスクは保有しています。
- connection request:contextは"beacon", "cspreport", "eventsource", "fetch", "ping", "xmlhttprequest"のどれかである。典型的にAPIのエンドポイントとして使用される。subresource requestsとリスクには似ているが、別途異なるルールを設定できる。
Entry Point Manifests
Entry Point Manifests は以下のようにJSONで記述されます。
{ ..., "epr": { "reportURL": "https://example.com/reporting-endpoint", "redirectURL": "https://example.com/", "navigationBehavior": "allowStrippedGET", "subresourceBehavior": "allowStrippedGET", "rules": [ { "path": "/", "types": [ "navigational" ], "allowData": false }, { "regex": "^/\\d+$", "types": [ "navigational" ], "allowData": false }, ... { "path": "/image", "types": [ "subresource" ], "allowData": true }, ] } }
各パラメータ
- reportURL:違反が会った時のレポートの送信先
- redirectURL:リダイレクトの振る舞い時のリダイレクト先
- navigationBehavior:navigational requestが下記のrulesにマッチしなかった時の振る舞いを定義する
- subresourceBehavior:navigational requestで、rulesにマッチしなかった場合の振る舞いを定義する。
- rules:各エンドポイントのルールを定義する
ルールセット
{ "path": "/image", "types": [ "subresource" ], "allowData": true },
- path:ルールのスコープを示すのPATHプレフィックス。
- refex:ルールのスコープを示す正規表現。
- types:設定されるリクエストタイプ。navigational, subresource, connectionのうち一つ以上が指定される。
- allowData:Trueであれば、クエリパラメータ、フラグメントプロパティ、リクエストボディを許可する
Behaviors
(多分別オリジンからのリクエストの際の話)
ルールにマッチしなかった場合は、navigationBehavior、subresourceBehaviorで指定された通りの振る舞いする。指定できるBehaviorは以下の通りである。
- allow:変更することなくリクエストを許可する。これは、レポートのみする挙動となる。
- block:リクエストをキャンセルし、ネットワークエラーを返す。
- redirect:指定されたURLにリダイレクトする。
- omitCredentials:Cookieやその他の認証情報をリクエストから削除する。
- allowStrippedGET:URLのフラグメントやクエリプロパティにnullを設定し、GETリクエストを許可する。POST及びその他のリクエストはキャンセルされ、ネットワークエラーを返す。
EPR header
サーバはHTTPレスポンスにおいてEPR headerを用いて、Entry Point Regulationを適用するように指示します。
- 安全でないURLではEPR headerの処理を中断する
- Web App Manifestの仕様に則って、manifest のURLを提供する
レポート
違反時に提出されるレポートのフォーマット
{ "epr-report": { "policy-fetch-time": Thu Apr 16 2015 14:23:46 GMT-0700 (PDT) "affected-uri": "http://example.org/page.html", "referrer": "http://evil.example.com/", "type": "navigational", "applied-behavior": "allowStrippedGET", "redirectedTo": "" } }