CSP の
しかしながら、
結果を
前提
以下、
django-csp 3.4 django-csp-reports 1.1
修正前の 実装
以下、
django-csp、
django-csp-reports の 設定方法
Django製のMezzanine で 構築された ブログに 対して http-observatory-cli で 脆弱性を 検証してみる | Monotalk report-uri に
post した データを MongoDB に 登録する 実装
Content Security Policy (CSP) のreport を 10 日くらい 集計して、 ポリシーを 見直す(の 途中) | Monotalk
修正後の 実装
以下、
* csp.py
CSP_REPORTS_ADDITIONAL_HANDLERS = ["blog.csp.collect_csp_reports"] # collect csp reports to Google Analytics import json from django.http import HttpResponse from django.http import HttpResponseBadRequest import random import requests import uuid def collect_csp_reports(request): if request.method == 'POST': json_data = request.body if isinstance(json_data, bytes): json_data = json_data.decode('utf-8') cid = request.COOKIES.get('_ga') if not cid or cid == "": cid = uuid.uuid4() json_dict = json.loads(json_data) json_dict = json_dict.get("csp-report", {}) payload = {"v": "1", "t": "event", "tid": "UA-XXXXXXXX-X", "cid": cid, "ni": "1", "dl": json_dict.get("document-uri", ""), "ec": "CSPReport", "ea": json_dict.get("violated-directive", ""), "el": json_dict.get("blocked-uri", ""), "ua": request.META.get('HTTP_USER_AGENT', ''), "z": random.randint(0, 99999), "ds": "WebApp", "ul": request.LANGUAGE_CODE } r = requests.post("https://www.google-analytics.com/collect", payload) return HttpResponse(status=r.status_code) else: return HttpResponseBadRequest(content='Bad Request...')
説明
以下、
CSP_REPORTS_ADDITIONAL_HANDLERS に
ついて
django-csp-reports の拡張ポイントに なります。
デフォルトではCSP レポートを ファイルに 書き出す POST 処理が 定義されていますが、 その POST 処理とともに、 この 設定値に 定義した 関数を 呼び出すことができます。 CSRF 対策 に
ついて
django-csp-reports で基本的な、 対策は 実施されているので、 POST 処理では 意識する 必要が ありません。
最新版だと、DOS 対策っぽい 処理も 入っていますが、 まだ、 pypi には パッケージと して 配布されてなさそうです。 POST される
CSP レポートの フォーマット
以下のような JSON 形式の文字列が POST されます。
"csp-report": { "blocked-uri": "https://cdn.viglink.com/images/pixel.gif?ch=1&rn=7.989542820989307", "disposition": "report", "document-uri": "https://www.monotalk.xyz/blog/amphtml-ads-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/", "effective-directive": "img-src", "original-policy": "script-src 'self' 'unsafe-inline' 'unsafe-eval' pagead2.googlesyndication.com www.google-analytics.com *.disqus.com c.disquscdn.com disqus.com *.googletagmanager.com *.google-analytics.com *.ampproject.org adservice.google.com tagmanager.google.com adservice.google.co.jp uh.nakanohito.jp platform.twitter.com cdn.syndication.twimg.com tagmanager.google.com googleads.g.doubleclick.net adservice.google.ca adservice.google.co.in adservice.google.co.kr adservice.google.co.th adservice.google.co.uk adservice.google.com.au adservice.google.com.br adservice.google.com.hk adservice.google.com.mm adservice.google.com.my adservice.google.com.ph adservice.google.com.sg adservice.google.com.tw adservice.google.com.vn adservice.google.de adservice.google.es adservice.google.fr cdn.mxpnl.com; connect-src 'self' *.disqus.com uh0.nakanohito.jp www.google-analytics.com pagead2.googlesyndication.com syndication.twitter.com 3p.ampproject.net www.googletagmanager.com api.mixpanel.com; style-src 'self' 'unsafe-inline' *.disquscdn.com *.google.com *.googleapis.com *.monotalk.xyz platform.twitter.com ton.twimg.com; font-src 'self' fonts.gstatic.com *.monotalk.xyz data:; object-src pagead2.googlesyndication.com; img-src 'self' *.disqus.com *.disquscdn.com *.googleusercontent.com *.google.com *.googledrive.comgoogledrive.com data: googledrive.com drive.google.com www.gstatic.com www.monotalk.xyz ssl.gstatic.com ir-jp.amazon-adsystem.com ssl.google-analytics.com www.google-analytics.com drive.google.com pagead2.googlesyndication.com stats.g.doubleclick.net; child-src 'self' googleads.g.doubleclick.net staticxx.facebook.com *.disqus.com kemsakurai.github.io *.ampproject.net syndication.twitter.com platform.twitter.com www.googletagmanager.com rcm-fe.amazon-adsystem.com disqus.com disqusads.com rcm-fe.amazon-adsystem.com; default-src 'self'; report-uri /report/", "referrer": "https://www.monotalk.xyz/blog/django-template-%E5%86%85%E3%81%A7%E9%95%B7%E3%81%84%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%9C%81%E7%95%A5%E3%81%99%E3%82%8B/", "script-sample": "", "status-code": 0, "violated-directive": "img-src" } }
Mesurement Protocol で、
送付する 項目に ついて
以下 のパラメータを 送付するようにしました。 - v
version 番号1
固定です。 - t
ヒットタイプevent
を設定しました。 - ni
非インタラクション としたかったので、 1
を設定しました。 - dl
ドキュメント URL を設定しました。 event の 場合、 設定不要かもしれません。 - ec
イベントカテゴリです。 CSPReport
を固定で 設定します。 - ea
イベントアクションです。 violated-directive
の値を 取得して 設定するようにしました。 - el
イベントラベルです。blocked-uri
を設定しました。 - ua
ユーザーエージェントです。ブラウザの ユーザーエージェントを 設定するようにしました。 - z
プロキシサーバ等のCache を 無効に するための パラメータです。
POST でMesurement Protocol を 送付する 場合は、 意味が なさそうですが、 設定しても 捨てられるだけなので 設定しています。 - ds
データソース、WebApp
を設定しました。 - ul
言語コードです。ブラウザの 言語コードを 設定しました。
- v
非同期処理で、
リクエスト転送を した ほうが いいかもしれない
POST された結果を、 同期処理で、 Google Analytics に 転送していますが、 同期処理で ブラウザ側に 処理を 待っていてもらう 必要も ないので、 非同期で スレッドを 立ち上げて 処理させてもよさそうです。
まとめ
report-uri に
Mesurement Protocol の
Mesurement Protocol だと、
以上です。
コメント