secure_headers 2.2.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of secure_headers might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8e454769ab715d2e94e5451190e7ef8679810ec0
4
- data.tar.gz: 9f0fd48b03bd3e8f5a60b85894492a4a9aee08a0
3
+ metadata.gz: 8505e6e7242a976db378e97869dd8690e49fbe54
4
+ data.tar.gz: 32b1d9c752c03f66987f007c41c795c7f57d8e6a
5
5
  SHA512:
6
- metadata.gz: 9ace533baba91512c2d8b15f12ed188d93feda9b20f7e682caaa740d413b1428e9c39deb2c2fbba4aec6462093f54126de9ca8cc5268d5b8d98851c82876fa6d
7
- data.tar.gz: 9b5e12226b456e4983eb31cd75f48ccadf34d80d125ff0fb67ee84afe56f3ca3a682890213e20e2c24e2c715073c0284b4ab8fc3fc86ad722c7ae6d08c0bb207
6
+ metadata.gz: 989eaa8a180a9d8f5172305eb2d0cb6df13e37a8ba49587c8d1596f8cd4864838982b127a9a26e74d441fd0236cd165b9299bf8206fa32ebfcd4d05d234b55a5
7
+ data.tar.gz: 7437baa6edae3a38c3f5023b8a94cc58aa563b9aed732db10767b7996eaaf53f5b2f7af6d872ad0775ce7a02e547353238d36a118bb3b6f3e734e6ed37d75dd7
@@ -13,7 +13,7 @@ describe OtherThingsController, :type => :controller do
13
13
  options = opts.merge(
14
14
  {
15
15
  'HTTPS' => 'on',
16
- 'HTTP_USER_AGENT' => "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0"
16
+ 'HTTP_USER_AGENT' => "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/537.22 (KHTML like Gecko) Chrome/25.0.1364.99 Safari/537.22"
17
17
  }
18
18
  )
19
19
 
@@ -13,7 +13,7 @@ describe OtherThingsController, :type => :controller do
13
13
  options = opts.merge(
14
14
  {
15
15
  'HTTPS' => 'on',
16
- 'HTTP_USER_AGENT' => "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0"
16
+ 'HTTP_USER_AGENT' => "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/537.22 (KHTML like Gecko) Chrome/25.0.1364.99 Safari/537.22"
17
17
  }
18
18
  )
19
19
 
@@ -1,6 +1,7 @@
1
1
  require 'uri'
2
2
  require 'base64'
3
3
  require 'securerandom'
4
+ require 'user_agent_parser'
4
5
 
5
6
  module SecureHeaders
6
7
  class ContentSecurityPolicyBuildError < StandardError; end
@@ -205,8 +206,12 @@ module SecureHeaders
205
206
  elsif %{self none}.include?(val)
206
207
  "'#{val}'"
207
208
  elsif val == 'nonce'
208
- self.class.set_nonce(@controller, nonce)
209
- ["'nonce-#{nonce}'", "'unsafe-inline'"]
209
+ if supports_nonces?(@ua)
210
+ self.class.set_nonce(@controller, nonce)
211
+ ["'nonce-#{nonce}'", "'unsafe-inline'"]
212
+ else
213
+ "'unsafe-inline'"
214
+ end
210
215
  else
211
216
  val
212
217
  end
@@ -258,5 +263,10 @@ module SecureHeaders
258
263
  def build_directive(key)
259
264
  "#{self.class.symbol_to_hyphen_case(key)} #{@config[key].join(" ")}; "
260
265
  end
266
+
267
+ def supports_nonces?(user_agent)
268
+ parsed_ua = UserAgentParser.parse(user_agent)
269
+ ["Chrome", "Opera", "Firefox"].include?(parsed_ua.family)
270
+ end
261
271
  end
262
272
  end
@@ -1,3 +1,3 @@
1
1
  module SecureHeaders
2
- VERSION = "2.2.0"
2
+ VERSION = "2.2.1"
3
3
  end
@@ -19,5 +19,6 @@ Gem::Specification.new do |gem|
19
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
20
  gem.require_paths = ["lib"]
21
21
  gem.add_development_dependency "rake"
22
+ gem.add_dependency "user_agent_parser"
22
23
  gem.post_install_message = "Warning: lambda config values will be broken until you add |controller|. e.g. :enforce => lambda { |controller| some_expression }"
23
24
  end
@@ -17,7 +17,8 @@ module SecureHeaders
17
17
  FIREFOX_23 = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:23.0) Gecko/20131011 Firefox/23.0"
18
18
  CHROME = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4"
19
19
  CHROME_25 = "Mozilla/5.0 (Macintosh; Intel Mac OS X 1084) AppleWebKit/537.22 (KHTML like Gecko) Chrome/25.0.1364.99 Safari/537.22"
20
-
20
+ SAFARI = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
21
+ OPERA = "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16"
21
22
 
22
23
  def request_for user_agent, request_uri=nil, options={:ssl => false}
23
24
  double(:ssl? => options[:ssl], :env => {'HTTP_USER_AGENT' => user_agent}, :url => (request_uri || 'http://areallylongdomainexample.com') )
@@ -184,11 +185,33 @@ module SecureHeaders
184
185
  end
185
186
 
186
187
  context "when using a nonce" do
187
- it "adds a nonce and unsafe-inline to the script-src value" do
188
+ it "adds a nonce and unsafe-inline to the script-src value when using chrome" do
188
189
  header = ContentSecurityPolicy.new(default_opts.merge(:script_src => "self nonce"), :request => request_for(CHROME))
189
190
  expect(header.value).to include("script-src 'self' 'nonce-#{header.nonce}' 'unsafe-inline'")
190
191
  end
191
192
 
193
+ it "adds a nonce and unsafe-inline to the script-src value when using firefox" do
194
+ header = ContentSecurityPolicy.new(default_opts.merge(:script_src => "self nonce"), :request => request_for(FIREFOX))
195
+ expect(header.value).to include("script-src 'self' 'nonce-#{header.nonce}' 'unsafe-inline'")
196
+ end
197
+
198
+ it "adds a nonce and unsafe-inline to the script-src value when using opera" do
199
+ header = ContentSecurityPolicy.new(default_opts.merge(:script_src => "self nonce"), :request => request_for(OPERA))
200
+ expect(header.value).to include("script-src 'self' 'nonce-#{header.nonce}' 'unsafe-inline'")
201
+ end
202
+
203
+ it "does not add a nonce and unsafe-inline to the script-src value when using Safari" do
204
+ header = ContentSecurityPolicy.new(default_opts.merge(:script_src => "self nonce"), :request => request_for(SAFARI))
205
+ expect(header.value).to include("script-src 'self' 'unsafe-inline'")
206
+ expect(header.value).not_to include("nonce")
207
+ end
208
+
209
+ it "does not add a nonce and unsafe-inline to the script-src value when using IE" do
210
+ header = ContentSecurityPolicy.new(default_opts.merge(:script_src => "self nonce"), :request => request_for(IE))
211
+ expect(header.value).to include("script-src 'self' 'unsafe-inline'")
212
+ expect(header.value).not_to include("nonce")
213
+ end
214
+
192
215
  it "adds a nonce and unsafe-inline to the style-src value" do
193
216
  header = ContentSecurityPolicy.new(default_opts.merge(:style_src => "self nonce"), :request => request_for(CHROME))
194
217
  expect(header.value).to include("style-src 'self' 'nonce-#{header.nonce}' 'unsafe-inline'")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: secure_headers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil Matatall
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-18 00:00:00.000000000 Z
11
+ date: 2015-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: user_agent_parser
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Security related headers all in one gem.
28
42
  email:
29
43
  - neil.matatall@gmail.com