rack-protection 1.5.5 → 2.0.2

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.
@@ -5,21 +5,30 @@ module Rack
5
5
  ##
6
6
  # Prevented attack:: CSRF
7
7
  # Supported browsers:: all
8
- # More infos:: http://flask.pocoo.org/docs/security/#json-security
8
+ # More infos:: http://flask.pocoo.org/docs/0.10/security/#json-security
9
+ # http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
9
10
  #
10
- # JSON GET APIs are vulnerable to being embedded as JavaScript while the
11
+ # JSON GET APIs are vulnerable to being embedded as JavaScript when the
11
12
  # Array prototype has been patched to track data. Checks the referrer
12
13
  # even on GET requests if the content type is JSON.
14
+ #
15
+ # If request includes Origin HTTP header, defers to HttpOrigin to determine
16
+ # if the request is safe. Please refer to the documentation for more info.
17
+ #
18
+ # The `:allow_if` option can be set to a proc to use custom allow/deny logic.
13
19
  class JsonCsrf < Base
20
+ default_options :allow_if => nil
21
+
14
22
  alias react deny
15
23
 
16
24
  def call(env)
17
25
  request = Request.new(env)
18
26
  status, headers, body = app.call(env)
19
27
 
20
- if has_vector? request, headers
28
+ if has_vector?(request, headers)
21
29
  warn env, "attack prevented by #{self.class}"
22
- react(env) or [status, headers, body]
30
+
31
+ react_and_close(env, body) or [status, headers, body]
23
32
  else
24
33
  [status, headers, body]
25
34
  end
@@ -27,9 +36,22 @@ module Rack
27
36
 
28
37
  def has_vector?(request, headers)
29
38
  return false if request.xhr?
39
+ return false if options[:allow_if] && options[:allow_if].call(request.env)
30
40
  return false unless headers['Content-Type'].to_s.split(';', 2).first =~ /^\s*application\/json\s*$/
31
41
  origin(request.env).nil? and referrer(request.env) != request.host
32
42
  end
43
+
44
+ def react_and_close(env, body)
45
+ reaction = react(env)
46
+
47
+ close_body(body) if reaction
48
+
49
+ reaction
50
+ end
51
+
52
+ def close_body(body)
53
+ body.close if body.respond_to?(:close)
54
+ end
33
55
  end
34
56
  end
35
57
  end
@@ -10,7 +10,7 @@ module Rack
10
10
  # Only accepts unsafe HTTP requests if a given access token matches the token
11
11
  # included in the session *or* the request comes from the same origin.
12
12
  #
13
- # Compatible with Rails and rack-csrf.
13
+ # Compatible with rack-csrf.
14
14
  class RemoteToken < AuthenticityToken
15
15
  default_reaction :deny
16
16
 
@@ -0,0 +1,39 @@
1
+ require 'rack/protection'
2
+
3
+ module Rack
4
+ module Protection
5
+ ##
6
+ # Prevented attack:: Protects against against protocol downgrade attacks and cookie hijacking.
7
+ # Supported browsers:: all
8
+ # More infos:: https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
9
+ #
10
+ # browser will prevent any communications from being sent over HTTP
11
+ # to the specified domain and will instead send all communications over HTTPS.
12
+ # It also prevents HTTPS click through prompts on browsers.
13
+ #
14
+ # Options:
15
+ #
16
+ # max_age:: How long future requests to the domain should go over HTTPS; specified in seconds
17
+ # include_subdomains:: If all present and future subdomains will be HTTPS
18
+ # preload:: Allow this domain to be included in browsers HSTS preload list. See https://hstspreload.appspot.com/
19
+
20
+ class StrictTransport < Base
21
+ default_options :max_age => 31_536_000, :include_subdomains => false, :preload => false
22
+
23
+ def strict_transport
24
+ @strict_transport ||= begin
25
+ strict_transport = 'max-age=' + options[:max_age].to_s
26
+ strict_transport += '; includeSubDomains' if options[:include_subdomains]
27
+ strict_transport += '; preload' if options[:preload]
28
+ strict_transport.to_str
29
+ end
30
+ end
31
+
32
+ def call(env)
33
+ status, headers, body = @app.call(env)
34
+ headers['Strict-Transport-Security'] ||= strict_transport
35
+ [status, headers, body]
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,16 +1,5 @@
1
1
  module Rack
2
2
  module Protection
3
- def self.version
4
- VERSION
5
- end
6
-
7
- SIGNATURE = [1, 5, 5]
8
- VERSION = SIGNATURE.join('.')
9
-
10
- VERSION.extend Comparable
11
- def VERSION.<=>(other)
12
- other = other.split('.').map { |i| i.to_i } if other.respond_to? :split
13
- SIGNATURE <=> Array(other)
14
- end
3
+ VERSION = '2.0.2'
15
4
  end
16
5
  end
@@ -4,7 +4,7 @@ module Rack
4
4
  module Protection
5
5
  ##
6
6
  # Prevented attack:: Non-permanent XSS
7
- # Supported browsers:: Internet Explorer 8 and later
7
+ # Supported browsers:: Internet Explorer 8+ and Chrome
8
8
  # More infos:: http://blogs.msdn.com/b/ie/archive/2008/07/01/ie8-security-part-iv-the-xss-filter.aspx
9
9
  #
10
10
  # Sets X-XSS-Protection header to tell the browser to block attacks.
@@ -3,36 +3,50 @@ require 'rack'
3
3
 
4
4
  module Rack
5
5
  module Protection
6
- autoload :AuthenticityToken, 'rack/protection/authenticity_token'
7
- autoload :Base, 'rack/protection/base'
8
- autoload :EscapedParams, 'rack/protection/escaped_params'
9
- autoload :FormToken, 'rack/protection/form_token'
10
- autoload :FrameOptions, 'rack/protection/frame_options'
11
- autoload :HttpOrigin, 'rack/protection/http_origin'
12
- autoload :IPSpoofing, 'rack/protection/ip_spoofing'
13
- autoload :JsonCsrf, 'rack/protection/json_csrf'
14
- autoload :PathTraversal, 'rack/protection/path_traversal'
15
- autoload :RemoteReferrer, 'rack/protection/remote_referrer'
16
- autoload :RemoteToken, 'rack/protection/remote_token'
17
- autoload :SessionHijacking, 'rack/protection/session_hijacking'
18
- autoload :XSSHeader, 'rack/protection/xss_header'
6
+ autoload :AuthenticityToken, 'rack/protection/authenticity_token'
7
+ autoload :Base, 'rack/protection/base'
8
+ autoload :CookieTossing, 'rack/protection/cookie_tossing'
9
+ autoload :ContentSecurityPolicy, 'rack/protection/content_security_policy'
10
+ autoload :EscapedParams, 'rack/protection/escaped_params'
11
+ autoload :FormToken, 'rack/protection/form_token'
12
+ autoload :FrameOptions, 'rack/protection/frame_options'
13
+ autoload :HttpOrigin, 'rack/protection/http_origin'
14
+ autoload :IPSpoofing, 'rack/protection/ip_spoofing'
15
+ autoload :JsonCsrf, 'rack/protection/json_csrf'
16
+ autoload :PathTraversal, 'rack/protection/path_traversal'
17
+ autoload :RemoteReferrer, 'rack/protection/remote_referrer'
18
+ autoload :RemoteToken, 'rack/protection/remote_token'
19
+ autoload :SessionHijacking, 'rack/protection/session_hijacking'
20
+ autoload :StrictTransport, 'rack/protection/strict_transport'
21
+ autoload :XSSHeader, 'rack/protection/xss_header'
19
22
 
20
23
  def self.new(app, options = {})
21
24
  # does not include: RemoteReferrer, AuthenticityToken and FormToken
22
25
  except = Array options[:except]
23
26
  use_these = Array options[:use]
27
+
28
+ if options.fetch(:without_session, false)
29
+ except += [:session_hijacking, :remote_token]
30
+ end
31
+
24
32
  Rack::Builder.new do
25
- use ::Rack::Protection::RemoteReferrer, options if use_these.include? :remote_referrer
26
- use ::Rack::Protection::AuthenticityToken,options if use_these.include? :authenticity_token
27
- use ::Rack::Protection::FormToken, options if use_these.include? :form_token
28
- use ::Rack::Protection::FrameOptions, options unless except.include? :frame_options
29
- use ::Rack::Protection::HttpOrigin, options unless except.include? :http_origin
30
- use ::Rack::Protection::IPSpoofing, options unless except.include? :ip_spoofing
31
- use ::Rack::Protection::JsonCsrf, options unless except.include? :json_csrf
32
- use ::Rack::Protection::PathTraversal, options unless except.include? :path_traversal
33
- use ::Rack::Protection::RemoteToken, options unless except.include? :remote_token
34
- use ::Rack::Protection::SessionHijacking, options unless except.include? :session_hijacking
35
- use ::Rack::Protection::XSSHeader, options unless except.include? :xss_header
33
+ # Off by default, unless added
34
+ use ::Rack::Protection::AuthenticityToken, options if use_these.include? :authenticity_token
35
+ use ::Rack::Protection::CookieTossing, options if use_these.include? :cookie_tossing
36
+ use ::Rack::Protection::ContentSecurityPolicy, options if use_these.include? :content_security_policy
37
+ use ::Rack::Protection::FormToken, options if use_these.include? :form_token
38
+ use ::Rack::Protection::RemoteReferrer, options if use_these.include? :remote_referrer
39
+ use ::Rack::Protection::StrictTransport, options if use_these.include? :strict_transport
40
+
41
+ # On by default, unless skipped
42
+ use ::Rack::Protection::FrameOptions, options unless except.include? :frame_options
43
+ use ::Rack::Protection::HttpOrigin, options unless except.include? :http_origin
44
+ use ::Rack::Protection::IPSpoofing, options unless except.include? :ip_spoofing
45
+ use ::Rack::Protection::JsonCsrf, options unless except.include? :json_csrf
46
+ use ::Rack::Protection::PathTraversal, options unless except.include? :path_traversal
47
+ use ::Rack::Protection::RemoteToken, options unless except.include? :remote_token
48
+ use ::Rack::Protection::SessionHijacking, options unless except.include? :session_hijacking
49
+ use ::Rack::Protection::XSSHeader, options unless except.include? :xss_header
36
50
  run app
37
51
  end.to_app
38
52
  end
@@ -1,118 +1,25 @@
1
- # Run `rake rack-protection.gemspec` to update the gemspec.
1
+ version = File.read(File.expand_path("../../VERSION", __FILE__)).strip
2
+
2
3
  Gem::Specification.new do |s|
3
4
  # general infos
4
5
  s.name = "rack-protection"
5
- s.version = "1.5.5"
6
- s.description = "You should use protection!"
7
- s.homepage = "http://github.com/rkh/rack-protection"
6
+ s.version = version
7
+ s.description = "Protect against typical web attacks, works with all Rack apps, including Rails."
8
+ s.homepage = "http://www.sinatrarb.com/protection/"
8
9
  s.summary = s.description
9
10
  s.license = 'MIT'
10
-
11
- # generated from git shortlog -sn
12
- s.authors = [
13
- "Konstantin Haase",
14
- "Alex Rodionov",
15
- "Patrick Ellis",
16
- "Jason Staten",
17
- "ITO Nobuaki",
18
- "Jeff Welling",
19
- "Matteo Centenaro",
20
- "Egor Homakov",
21
- "Florian Gilcher",
22
- "Fojas",
23
- "Igor Bochkariov",
24
- "Mael Clerambault",
25
- "Martin Mauch",
26
- "Renne Nissinen",
27
- "SAKAI, Kazuaki",
28
- "Stanislav Savulchik",
29
- "Steve Agalloco",
30
- "TOBY",
31
- "Thais Camilo and Konstantin Haase",
32
- "Vipul A M",
33
- "Akzhan Abdulin",
34
- "brookemckim",
35
- "Bj\u{f8}rge N\u{e6}ss",
36
- "Chris Heald",
37
- "Chris Mytton",
38
- "Corey Ward",
39
- "Dario Cravero",
40
- "David Kellum"
41
- ]
42
-
43
- # generated from git shortlog -sne
44
- s.email = [
45
- "konstantin.mailinglists@googlemail.com",
46
- "p0deje@gmail.com",
47
- "jstaten07@gmail.com",
48
- "patrick@soundcloud.com",
49
- "jeff.welling@gmail.com",
50
- "bugant@gmail.com",
51
- "daydream.trippers@gmail.com",
52
- "florian.gilcher@asquera.de",
53
- "developer@fojasaur.us",
54
- "ujifgc@gmail.com",
55
- "mael@clerambault.fr",
56
- "martin.mauch@gmail.com",
57
- "rennex@iki.fi",
58
- "kaz.july.7@gmail.com",
59
- "s.savulchik@gmail.com",
60
- "steve.agalloco@gmail.com",
61
- "toby.net.info.mail+git@gmail.com",
62
- "dev+narwen+rkh@rkh.im",
63
- "vipulnsward@gmail.com",
64
- "akzhan.abdulin@gmail.com",
65
- "brooke@digitalocean.com",
66
- "bjoerge@bengler.no",
67
- "cheald@gmail.com",
68
- "self@hecticjeff.net",
69
- "coreyward@me.com",
70
- "dario@uxtemple.com",
71
- "dek-oss@gravitext.com",
72
- "homakov@gmail.com"
73
- ]
74
-
75
- # generated from git ls-files
76
- s.files = [
11
+ s.authors = ["https://github.com/sinatra/sinatra/graphs/contributors"]
12
+ s.email = "sinatrarb@googlegroups.com"
13
+ s.files = Dir["lib/**/*.rb"] + [
77
14
  "License",
78
15
  "README.md",
79
16
  "Rakefile",
80
- "lib/rack-protection.rb",
81
- "lib/rack/protection.rb",
82
- "lib/rack/protection/authenticity_token.rb",
83
- "lib/rack/protection/base.rb",
84
- "lib/rack/protection/escaped_params.rb",
85
- "lib/rack/protection/form_token.rb",
86
- "lib/rack/protection/frame_options.rb",
87
- "lib/rack/protection/http_origin.rb",
88
- "lib/rack/protection/ip_spoofing.rb",
89
- "lib/rack/protection/json_csrf.rb",
90
- "lib/rack/protection/path_traversal.rb",
91
- "lib/rack/protection/remote_referrer.rb",
92
- "lib/rack/protection/remote_token.rb",
93
- "lib/rack/protection/session_hijacking.rb",
94
- "lib/rack/protection/version.rb",
95
- "lib/rack/protection/xss_header.rb",
96
- "rack-protection.gemspec",
97
- "spec/authenticity_token_spec.rb",
98
- "spec/base_spec.rb",
99
- "spec/escaped_params_spec.rb",
100
- "spec/form_token_spec.rb",
101
- "spec/frame_options_spec.rb",
102
- "spec/http_origin_spec.rb",
103
- "spec/ip_spoofing_spec.rb",
104
- "spec/json_csrf_spec.rb",
105
- "spec/path_traversal_spec.rb",
106
- "spec/protection_spec.rb",
107
- "spec/remote_referrer_spec.rb",
108
- "spec/remote_token_spec.rb",
109
- "spec/session_hijacking_spec.rb",
110
- "spec/spec_helper.rb",
111
- "spec/xss_header_spec.rb"
17
+ "Gemfile",
18
+ "rack-protection.gemspec"
112
19
  ]
113
20
 
114
21
  # dependencies
115
22
  s.add_dependency "rack"
116
23
  s.add_development_dependency "rack-test"
117
- s.add_development_dependency "rspec", "~> 2.0"
24
+ s.add_development_dependency "rspec", "~> 3.6"
118
25
  end
metadata CHANGED
@@ -1,41 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-protection
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.5
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
- - Konstantin Haase
8
- - Alex Rodionov
9
- - Patrick Ellis
10
- - Jason Staten
11
- - ITO Nobuaki
12
- - Jeff Welling
13
- - Matteo Centenaro
14
- - Egor Homakov
15
- - Florian Gilcher
16
- - Fojas
17
- - Igor Bochkariov
18
- - Mael Clerambault
19
- - Martin Mauch
20
- - Renne Nissinen
21
- - SAKAI, Kazuaki
22
- - Stanislav Savulchik
23
- - Steve Agalloco
24
- - TOBY
25
- - Thais Camilo and Konstantin Haase
26
- - Vipul A M
27
- - Akzhan Abdulin
28
- - brookemckim
29
- - Bjørge Næss
30
- - Chris Heald
31
- - Chris Mytton
32
- - Corey Ward
33
- - Dario Cravero
34
- - David Kellum
7
+ - https://github.com/sinatra/sinatra/graphs/contributors
35
8
  autorequire:
36
9
  bindir: bin
37
10
  cert_chain: []
38
- date: 2018-03-07 00:00:00.000000000 Z
11
+ date: 2018-06-05 00:00:00.000000000 Z
39
12
  dependencies:
40
13
  - !ruby/object:Gem::Dependency
41
14
  name: rack
@@ -71,48 +44,22 @@ dependencies:
71
44
  requirements:
72
45
  - - "~>"
73
46
  - !ruby/object:Gem::Version
74
- version: '2.0'
47
+ version: '3.6'
75
48
  type: :development
76
49
  prerelease: false
77
50
  version_requirements: !ruby/object:Gem::Requirement
78
51
  requirements:
79
52
  - - "~>"
80
53
  - !ruby/object:Gem::Version
81
- version: '2.0'
82
- description: You should use protection!
83
- email:
84
- - konstantin.mailinglists@googlemail.com
85
- - p0deje@gmail.com
86
- - jstaten07@gmail.com
87
- - patrick@soundcloud.com
88
- - jeff.welling@gmail.com
89
- - bugant@gmail.com
90
- - daydream.trippers@gmail.com
91
- - florian.gilcher@asquera.de
92
- - developer@fojasaur.us
93
- - ujifgc@gmail.com
94
- - mael@clerambault.fr
95
- - martin.mauch@gmail.com
96
- - rennex@iki.fi
97
- - kaz.july.7@gmail.com
98
- - s.savulchik@gmail.com
99
- - steve.agalloco@gmail.com
100
- - toby.net.info.mail+git@gmail.com
101
- - dev+narwen+rkh@rkh.im
102
- - vipulnsward@gmail.com
103
- - akzhan.abdulin@gmail.com
104
- - brooke@digitalocean.com
105
- - bjoerge@bengler.no
106
- - cheald@gmail.com
107
- - self@hecticjeff.net
108
- - coreyward@me.com
109
- - dario@uxtemple.com
110
- - dek-oss@gravitext.com
111
- - homakov@gmail.com
54
+ version: '3.6'
55
+ description: Protect against typical web attacks, works with all Rack apps, including
56
+ Rails.
57
+ email: sinatrarb@googlegroups.com
112
58
  executables: []
113
59
  extensions: []
114
60
  extra_rdoc_files: []
115
61
  files:
62
+ - Gemfile
116
63
  - License
117
64
  - README.md
118
65
  - Rakefile
@@ -120,6 +67,8 @@ files:
120
67
  - lib/rack/protection.rb
121
68
  - lib/rack/protection/authenticity_token.rb
122
69
  - lib/rack/protection/base.rb
70
+ - lib/rack/protection/content_security_policy.rb
71
+ - lib/rack/protection/cookie_tossing.rb
123
72
  - lib/rack/protection/escaped_params.rb
124
73
  - lib/rack/protection/form_token.rb
125
74
  - lib/rack/protection/frame_options.rb
@@ -130,25 +79,11 @@ files:
130
79
  - lib/rack/protection/remote_referrer.rb
131
80
  - lib/rack/protection/remote_token.rb
132
81
  - lib/rack/protection/session_hijacking.rb
82
+ - lib/rack/protection/strict_transport.rb
133
83
  - lib/rack/protection/version.rb
134
84
  - lib/rack/protection/xss_header.rb
135
85
  - rack-protection.gemspec
136
- - spec/authenticity_token_spec.rb
137
- - spec/base_spec.rb
138
- - spec/escaped_params_spec.rb
139
- - spec/form_token_spec.rb
140
- - spec/frame_options_spec.rb
141
- - spec/http_origin_spec.rb
142
- - spec/ip_spoofing_spec.rb
143
- - spec/json_csrf_spec.rb
144
- - spec/path_traversal_spec.rb
145
- - spec/protection_spec.rb
146
- - spec/remote_referrer_spec.rb
147
- - spec/remote_token_spec.rb
148
- - spec/session_hijacking_spec.rb
149
- - spec/spec_helper.rb
150
- - spec/xss_header_spec.rb
151
- homepage: http://github.com/rkh/rack-protection
86
+ homepage: http://www.sinatrarb.com/protection/
152
87
  licenses:
153
88
  - MIT
154
89
  metadata: {}
@@ -168,8 +103,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
103
  version: '0'
169
104
  requirements: []
170
105
  rubyforge_project:
171
- rubygems_version: 2.7.3
106
+ rubygems_version: 2.7.6
172
107
  signing_key:
173
108
  specification_version: 4
174
- summary: You should use protection!
109
+ summary: Protect against typical web attacks, works with all Rack apps, including
110
+ Rails.
175
111
  test_files: []
@@ -1,48 +0,0 @@
1
- require File.expand_path('../spec_helper.rb', __FILE__)
2
-
3
- describe Rack::Protection::AuthenticityToken do
4
- it_behaves_like "any rack application"
5
-
6
- it "denies post requests without any token" do
7
- post('/').should_not be_ok
8
- end
9
-
10
- it "accepts post requests with correct X-CSRF-Token header" do
11
- post('/', {}, 'rack.session' => {:csrf => "a"}, 'HTTP_X_CSRF_TOKEN' => "a")
12
- last_response.should be_ok
13
- end
14
-
15
- it "denies post requests with wrong X-CSRF-Token header" do
16
- post('/', {}, 'rack.session' => {:csrf => "a"}, 'HTTP_X_CSRF_TOKEN' => "b")
17
- last_response.should_not be_ok
18
- end
19
-
20
- it "accepts post form requests with correct authenticity_token field" do
21
- post('/', {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "a"})
22
- last_response.should be_ok
23
- end
24
-
25
- it "denies post form requests with wrong authenticity_token field" do
26
- post('/', {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "b"})
27
- last_response.should_not be_ok
28
- end
29
-
30
- it "prevents ajax requests without a valid token" do
31
- post('/', {}, "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest").should_not be_ok
32
- end
33
-
34
- it "allows for a custom authenticity token param" do
35
- mock_app do
36
- use Rack::Protection::AuthenticityToken, :authenticity_param => 'csrf_param'
37
- run proc { |e| [200, {'Content-Type' => 'text/plain'}, ['hi']] }
38
- end
39
-
40
- post('/', {"csrf_param" => "a"}, 'rack.session' => {:csrf => "a"})
41
- last_response.should be_ok
42
- end
43
-
44
- it "sets a new csrf token for the session in env, even after a 'safe' request" do
45
- get('/', {}, {})
46
- env['rack.session'][:csrf].should_not be_nil
47
- end
48
- end
data/spec/base_spec.rb DELETED
@@ -1,40 +0,0 @@
1
- require File.expand_path('../spec_helper.rb', __FILE__)
2
-
3
- describe Rack::Protection::Base do
4
-
5
- subject { described_class.new(lambda {}) }
6
-
7
- describe "#random_string" do
8
- it "outputs a string of 32 characters" do
9
- subject.random_string.length.should == 32
10
- end
11
- end
12
-
13
- describe "#referrer" do
14
- it "Reads referrer from Referer header" do
15
- env = {"HTTP_HOST" => "foo.com", "HTTP_REFERER" => "http://bar.com/valid"}
16
- subject.referrer(env).should == "bar.com"
17
- end
18
-
19
- it "Reads referrer from Host header when Referer header is relative" do
20
- env = {"HTTP_HOST" => "foo.com", "HTTP_REFERER" => "/valid"}
21
- subject.referrer(env).should == "foo.com"
22
- end
23
-
24
- it "Reads referrer from Host header when Referer header is missing" do
25
- env = {"HTTP_HOST" => "foo.com"}
26
- subject.referrer(env).should == "foo.com"
27
- end
28
-
29
- it "Returns nil when Referer header is missing and allow_empty_referrer is false" do
30
- env = {"HTTP_HOST" => "foo.com"}
31
- subject.options[:allow_empty_referrer] = false
32
- subject.referrer(env).should be_nil
33
- end
34
-
35
- it "Returns nil when Referer header is invalid" do
36
- env = {"HTTP_HOST" => "foo.com", "HTTP_REFERER" => "http://bar.com/bad|uri"}
37
- subject.referrer(env).should be_nil
38
- end
39
- end
40
- end
@@ -1,43 +0,0 @@
1
- require File.expand_path('../spec_helper.rb', __FILE__)
2
-
3
- describe Rack::Protection::EscapedParams do
4
- it_behaves_like "any rack application"
5
-
6
- context 'escaping' do
7
- it 'escapes html entities' do
8
- mock_app do |env|
9
- request = Rack::Request.new(env)
10
- [200, {'Content-Type' => 'text/plain'}, [request.params['foo']]]
11
- end
12
- get '/', :foo => "<bar>"
13
- body.should == '&lt;bar&gt;'
14
- end
15
-
16
- it 'leaves normal params untouched' do
17
- mock_app do |env|
18
- request = Rack::Request.new(env)
19
- [200, {'Content-Type' => 'text/plain'}, [request.params['foo']]]
20
- end
21
- get '/', :foo => "bar"
22
- body.should == 'bar'
23
- end
24
-
25
- it 'copes with nested arrays' do
26
- mock_app do |env|
27
- request = Rack::Request.new(env)
28
- [200, {'Content-Type' => 'text/plain'}, [request.params['foo']['bar']]]
29
- end
30
- get '/', :foo => {:bar => "<bar>"}
31
- body.should == '&lt;bar&gt;'
32
- end
33
-
34
- it 'leaves cache-breaker params untouched' do
35
- mock_app do |env|
36
- [200, {'Content-Type' => 'text/plain'}, ['hi']]
37
- end
38
-
39
- get '/?95df8d9bf5237ad08df3115ee74dcb10'
40
- body.should == 'hi'
41
- end
42
- end
43
- end
@@ -1,33 +0,0 @@
1
- require File.expand_path('../spec_helper.rb', __FILE__)
2
-
3
- describe Rack::Protection::FormToken do
4
- it_behaves_like "any rack application"
5
-
6
- it "denies post requests without any token" do
7
- post('/').should_not be_ok
8
- end
9
-
10
- it "accepts post requests with correct X-CSRF-Token header" do
11
- post('/', {}, 'rack.session' => {:csrf => "a"}, 'HTTP_X_CSRF_TOKEN' => "a")
12
- last_response.should be_ok
13
- end
14
-
15
- it "denies post requests with wrong X-CSRF-Token header" do
16
- post('/', {}, 'rack.session' => {:csrf => "a"}, 'HTTP_X_CSRF_TOKEN' => "b")
17
- last_response.should_not be_ok
18
- end
19
-
20
- it "accepts post form requests with correct authenticity_token field" do
21
- post('/', {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "a"})
22
- last_response.should be_ok
23
- end
24
-
25
- it "denies post form requests with wrong authenticity_token field" do
26
- post('/', {"authenticity_token" => "a"}, 'rack.session' => {:csrf => "b"})
27
- last_response.should_not be_ok
28
- end
29
-
30
- it "accepts ajax requests without a valid token" do
31
- post('/', {}, "HTTP_X_REQUESTED_WITH" => "XMLHttpRequest").should be_ok
32
- end
33
- end