Skip to content

Commit a85b80c

Browse files
authored
Merge pull request #293 from twitter/safari-nonce-support
safari 10 supports nonces
2 parents f543be0 + af338e8 commit a85b80c

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

lib/secure_headers/headers/content_security_policy.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class ContentSecurityPolicy
88

99
# constants to be used for version-specific UA sniffing
1010
VERSION_46 = ::UserAgent::Version.new("46")
11+
VERSION_10 = ::UserAgent::Version.new("10")
1112

1213
def initialize(config = nil, user_agent = OTHER)
1314
@config = if config.is_a?(Hash)
@@ -223,7 +224,8 @@ def supported_directives
223224
end
224225

225226
def nonces_supported?
226-
@nonces_supported ||= MODERN_BROWSERS.include?(@parsed_ua.browser)
227+
@nonces_supported ||= MODERN_BROWSERS.include?(@parsed_ua.browser) ||
228+
@parsed_ua.browser == "Safari" && @parsed_ua.version >= VERSION_10
227229
end
228230

229231
def symbol_to_hyphen_case(sym)

spec/lib/secure_headers_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,20 @@ module SecureHeaders
277277
expect(hash['Content-Security-Policy']).to eq("default-src 'self'; script-src mycdn.com 'nonce-#{nonce}'; style-src 'self'")
278278
end
279279

280+
it "uses a nonce for safari 10+" do
281+
Configuration.default do |config|
282+
config.csp = {
283+
default_src: %w('self'),
284+
script_src: %w(mycdn.com)
285+
}
286+
end
287+
288+
safari_request = Rack::Request.new(request.env.merge("HTTP_USER_AGENT" => USER_AGENTS[:safari10]))
289+
nonce = SecureHeaders.content_security_policy_script_nonce(safari_request)
290+
hash = SecureHeaders.header_hash_for(safari_request)
291+
expect(hash['Content-Security-Policy']).to eq("default-src 'self'; script-src mycdn.com 'nonce-#{nonce}'")
292+
end
293+
280294
it "supports the deprecated `report_only: true` format" do
281295
expect(Kernel).to receive(:warn).once
282296

spec/spec_helper.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
ios6: "Mozilla/5.0 (iPhone; CPU iPhone OS 614 like Mac OS X) AppleWebKit/536.26 (KHTML like Gecko) Version/6.0 Mobile/10B350 Safari/8536.25",
2222
safari5: "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3",
2323
safari5_1: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10",
24-
safari6: "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1"
24+
safari6: "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/536.30.1 (KHTML like Gecko) Version/6.0.5 Safari/536.30.1",
25+
safari10: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.11 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.11"
2526
}
2627

2728
def expect_default_values(hash)

0 commit comments

Comments
 (0)