CSP の設定
参考:
Ruby on Rails 5.2 の新機能 (Active Storage, Content Security Policy など) – Qiita
RailsでContent Security Policy (CSP) 導入する | Templarbit
Ruby on Rails Content-Security-Policy (CSP) | Rails security by bauland42
Content Security Policy | Ruby on Rails Guides [Official]
書き方
参考:
CSP (Contents Security Policy) の記述例 | Web Application Security Memo
Content Security Policy | Ruby on Rails Guides [Official]
Rails UJS, Turbolinks and CSP – Stack Overflow
リファレンス
参考:
Content Security Policy CSP Reference & Examples | Foundeo Inc.
まとめ
参考:
CSP
参考:
コンテンツ セキュリティ ポリシー | Google Developers
Content Security Policy でユーザーを守ろう | bitbank techblog
default-src
参考:
base-uri
参考:
base タグとは|コーディングのプロが作る HTML タグ辞典
frame-ancestors
参考:
img-src
参考:
media-src
参考:
script-src
参考:
nonce-source について調べてみた | A Day in Serenity (Reloaded)
script-src で nonce を使う
config/initializers/content_security_policy.rb で nonce ジェネレーターを設定する。
Rails.application.config.content_security_policy_nonce_generator = \
-> (_request) { SecureRandom.base64(16) }
ビューのレイアウトで rails-ujs で使われる meta タグを生成する。
<%= csp_meta_tag %>
JavaScript をファイルから読み込む際に nonce を有効にする。
<%= javascript_include_tag "script", nonce: true %>
JavaScript を埋め込む際に nonce を有効にする。
<%= javascript_tag nonce: true do %>
alert('hello, nonce!')
<% end %>
script タグに nonce を埋め込む。
<script nonce="<%= content_security_policy_nonce %>">
alert('hello, nonce!')
</script>
参考:
Content Security Policy | Ruby on Rails Guides [Official]
csp_meta_tag – ActionView::Helpers::CspHelper | Ruby on Rails API [Official]
javascript_tag – ActionView::Helpers::JavaScriptHelper | Ruby on Rails API [Official]
rails/javascript_helper.rb at v5.2.2 · rails/rails – GitHub
Webpacker
参考:
Webpacker and CSP · Issue #1057 · rails/webpacker – GitHub
Webpack
参考:
Add support for `nonce` attribute (CSP) · Issue #455 · webpack/webpack – GitHub
Vue.js
参考:
ランタイム + コンパイラとランタイム限定の違い | Vue.js [公式]
Vue – rails/webpacker: Use Webpack to manage app-like JavaScript modules in Rails – GitHub
CSP environments | Vue.js [Official]
nonce の仕組み
HTTP レスポンスヘッダーで Content-Security-Policy を出力する。
Content-Security-Policy: script-src 'nonce-01234abcde';
レスポンスボディ (HTML) の script タグに nonce を埋め込む。
<script nonce="01234abcde">
alert('hello, nonce!');
</script>
参考:
rails commit log 流し読み 2018/02/23 | なるようになるブログ
翻訳 現実の Web に向けた CSP | Mozilla Security Blog 日本語版
そろそろ CSP Lv.2 nonce やろう | teppeis blog
Content-Security-Policy と nonce の話 | tokuhirom’s blog
content_security_policy_nonce_generator
config/initializers/content_security_policy.rb で nonce ジェネレーターを設定する。
Rails.application.config.content_security_policy_nonce_generator =
-> (_request) { SecureRandom.base64(16) }
参考:
rails/content_security_policy.rb.tt at v5.2.2 · rails/rails – GitHub
content_security_policy_nonce_directives
nonce を付与するディレクティブを指定する。
Rails.application.config.content_security_policy_nonce_directives = %w[script-src]
参考:
content_security_policy_nonce_directives – rails/application.rb at v6.0.0.rc2 · rails/rails – GitHub
csp_meta_tag
rails-ujs が Ajax などで用いる nonce を埋め込んだ meta タグを生成する。
<html>
<head>
...
<%= csp_meta_tag %>
...
</head>
...
</html>
参考:
csp_meta_tag – ActionView::Helpers::CspHelper | Ruby on Rails API [Official]
rails/csp_helper.rb at v5.2.2 · rails/rails – GitHub
ActionDispatch::ContentSecurityPolicy
参考:
ActionDispatch::ContentSecurityPolicy | Ruby on Rails API [Official]
rails/content_security_policy.rb at v5.2.2 · rails/rails – GitHub
content_security_policy_nonce
コントローラーやビューからはリクエストに含まれる値を参照できる。
request.content_security_policy_nonce
ミドルウェアからは env に含まれる値を参照できる。
env["action_dispatch.content_security_policy_nonce"]
参考:
rails/javascript_helper.rb at v5.2.2 · rails/rails
rails/action_controller/metal/content_security_policy.rb at v5.2.2 · rails/rails – GitHub
rails/action_dispatch/http/content_security_policy.rb at v5.2.2 · rails/rails – GitHub
cspNonce
JavaScript 内からは Rails.cspNonce() で meta タグに設定された nonce を取得できる。
console.log(Rails.cspNonce())
参考:
rails/csp.coffee at v5.2.2 · rails/rails – GitHub
CSP Level 3
参考:
Content Security Policy Level 3 における XSS 対策 | pixiv inside
Chrome の img-src バグ
普通のブラウザはこれで全て読み込める。
img-src: *;
Chrome は * に data: が含まれないので、別途 data: の指定が必要。
img-src: * data:;
参考:
img-src * としたのに Chrome で blob の画像を読み込もうとしたらセキュリティーエラーになった。- Qiita
Content Security Policy “data” not working for base64 Images in Chrome 28 – Stack Overflow
CSP の設定をしたら RVT が使えなくなった
コントローラーで CSP ヘッダーを設定する。
module RVT
class ApplicationController < ActionController::Base
before_action :set_content_security_policy_header
CONTENT_SECURITY_POLICY = %w[
default-src 'self' https:;
font-src 'self';
img-src * data:;
object-src 'none';
style-src
'self' 'unsafe-inline';
script-src
'self' 'unsafe-inline' 'unsafe-eval';
media-src 'none';
connect-src
'self'
http://localhost:3035
ws://localhost:3035;
base-uri 'self';
frame-ancestors 'self' https:;
].join(" ")
def set_content_security_policy_header
response.set_header(
"Content-Security-Policy",
CONTENT_SECURITY_POLICY
)
end
end
end