rack-protection 1.0.0 → 1.1.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.
Potentially problematic release.
This version of rack-protection might be problematic. Click here for more details.
- data/README.md +8 -0
- data/lib/rack/protection/escaped_params.rb +33 -7
- data/lib/rack/protection/ip_spoofing.rb +1 -1
- data/lib/rack/protection/path_traversal.rb +11 -4
- data/lib/rack/protection/version.rb +6 -34
- data/rack-protection.gemspec +3 -2
- metadata +11 -20
data/README.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
require 'rack/protection'
|
2
|
-
require '
|
2
|
+
require 'rack/utils'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'escape_utils'
|
6
|
+
rescue LoadError
|
7
|
+
end
|
3
8
|
|
4
9
|
module Rack
|
5
10
|
module Protection
|
@@ -16,14 +21,28 @@ module Rack
|
|
16
21
|
# escape:: What escaping modes to use, should be Symbol or Array of Symbols.
|
17
22
|
# Available: :html (default), :javascript, :url
|
18
23
|
class EscapedParams < Base
|
19
|
-
|
24
|
+
extend Rack::Utils
|
25
|
+
|
26
|
+
class << self
|
27
|
+
alias escape_url escape
|
28
|
+
public :escape_html
|
29
|
+
end
|
30
|
+
|
31
|
+
default_options :escape => :html,
|
32
|
+
:escaper => defined?(EscapeUtils) ? EscapeUtils : self
|
20
33
|
|
21
34
|
def initialize(*)
|
22
35
|
super
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
36
|
+
|
37
|
+
modes = Array options[:escape]
|
38
|
+
@escaper = options[:escaper]
|
39
|
+
@html = modes.include? :html
|
40
|
+
@javascript = modes.include? :javascript
|
41
|
+
@url = modes.include? :url
|
42
|
+
|
43
|
+
if @javascript and not @escaper.respond_to? :escape_javascript
|
44
|
+
fail("Use EscapeUtils for JavaScript escaping.")
|
45
|
+
end
|
27
46
|
end
|
28
47
|
|
29
48
|
def call(env)
|
@@ -32,7 +51,7 @@ module Rack
|
|
32
51
|
post_was = handle(request.POST) rescue nil
|
33
52
|
app.call env
|
34
53
|
ensure
|
35
|
-
request.GET.replace get_was
|
54
|
+
request.GET.replace get_was if get_was
|
36
55
|
request.POST.replace post_was if post_was
|
37
56
|
end
|
38
57
|
|
@@ -56,6 +75,13 @@ module Rack
|
|
56
75
|
hash.each { |k,v| hash[k] = escape(v) }
|
57
76
|
hash
|
58
77
|
end
|
78
|
+
|
79
|
+
def escape_string(str)
|
80
|
+
str = @escaper.escape_url(str) if @url
|
81
|
+
str = @escaper.escape_html(str) if @html
|
82
|
+
str = @escaper.escape_javascript(str) if @javascript
|
83
|
+
str
|
84
|
+
end
|
59
85
|
end
|
60
86
|
end
|
61
87
|
end
|
@@ -13,7 +13,7 @@ module Rack
|
|
13
13
|
|
14
14
|
def accepts?(env)
|
15
15
|
return true unless env.include? 'HTTP_X_FORWARDED_FOR'
|
16
|
-
ips = env['HTTP_X_FORWARDED_FOR'].split
|
16
|
+
ips = env['HTTP_X_FORWARDED_FOR'].split(/\s*,\s*/)
|
17
17
|
return false if env.include? 'HTTP_CLIENT_IP' and not ips.include? env['HTTP_CLIENT_IP']
|
18
18
|
return false if env.include? 'HTTP_X_REAL_IP' and not ips.include? env['HTTP_X_REAL_IP']
|
19
19
|
true
|
@@ -19,10 +19,17 @@ module Rack
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def cleanup(path)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
parts = []
|
23
|
+
unescaped = path.gsub('%2e', '.').gsub('%2f', '/')
|
24
|
+
|
25
|
+
unescaped.split('/').each do |part|
|
26
|
+
next if part.empty? or part == '.'
|
27
|
+
part == '..' ? parts.pop : parts << part
|
28
|
+
end
|
29
|
+
|
30
|
+
cleaned = '/' << parts.join('/')
|
31
|
+
cleaned << '/' if parts.any? and unescaped =~ /\/\.{0,2}$/
|
32
|
+
cleaned
|
26
33
|
end
|
27
34
|
end
|
28
35
|
end
|
@@ -4,41 +4,13 @@ module Rack
|
|
4
4
|
VERSION
|
5
5
|
end
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
SIGNATURE = [1, 1, 2]
|
8
|
+
VERSION = SIGNATURE.join('.')
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
SIGNATURE
|
14
|
-
STRING = SIGNATURE.join '.'
|
15
|
-
|
16
|
-
def self.major; MAJOR end
|
17
|
-
def self.minor; MINOR end
|
18
|
-
def self.tiny; TINY end
|
19
|
-
def self.to_s; STRING end
|
20
|
-
|
21
|
-
def self.hash
|
22
|
-
STRING.hash
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.<=>(other)
|
26
|
-
other = other.split('.').map { |i| i.to_i } if other.respond_to? :split
|
27
|
-
SIGNATURE <=> Array(other)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.inspect
|
31
|
-
STRING.inspect
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.respond_to?(meth, *)
|
35
|
-
meth.to_s !~ /^__|^to_str$/ and STRING.respond_to? meth unless super
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.method_missing(meth, *args, &block)
|
39
|
-
return super unless STRING.respond_to?(meth)
|
40
|
-
STRING.send(meth, *args, &block)
|
41
|
-
end
|
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)
|
42
14
|
end
|
43
15
|
end
|
44
16
|
end
|
data/rack-protection.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
# general infos
|
4
4
|
s.name = "rack-protection"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.1.2"
|
6
6
|
s.description = "You should use protection!"
|
7
7
|
s.homepage = "http://github.com/rkh/rack-protection"
|
8
8
|
s.summary = s.description
|
@@ -11,6 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.authors = [
|
12
12
|
"Konstantin Haase",
|
13
13
|
"Corey Ward",
|
14
|
+
"David Kellum",
|
14
15
|
"Fojas"
|
15
16
|
]
|
16
17
|
|
@@ -18,6 +19,7 @@ Gem::Specification.new do |s|
|
|
18
19
|
s.email = [
|
19
20
|
"konstantin.mailinglists@googlemail.com",
|
20
21
|
"coreyward@me.com",
|
22
|
+
"dek-oss@gravitext.com",
|
21
23
|
"developer@fojasaur.us"
|
22
24
|
]
|
23
25
|
|
@@ -59,7 +61,6 @@ Gem::Specification.new do |s|
|
|
59
61
|
|
60
62
|
# dependencies
|
61
63
|
s.add_dependency "rack"
|
62
|
-
s.add_dependency "escape_utils"
|
63
64
|
s.add_development_dependency "rack-test"
|
64
65
|
s.add_development_dependency "rspec", "~> 2.0"
|
65
66
|
end
|
metadata
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-protection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Konstantin Haase
|
9
9
|
- Corey Ward
|
10
|
+
- David Kellum
|
10
11
|
- Fojas
|
11
12
|
autorequire:
|
12
13
|
bindir: bin
|
13
14
|
cert_chain: []
|
14
|
-
date: 2011-
|
15
|
+
date: 2011-10-01 00:00:00.000000000Z
|
15
16
|
dependencies:
|
16
17
|
- !ruby/object:Gem::Dependency
|
17
18
|
name: rack
|
18
|
-
requirement: &
|
19
|
+
requirement: &2152912960 !ruby/object:Gem::Requirement
|
19
20
|
none: false
|
20
21
|
requirements:
|
21
22
|
- - ! '>='
|
@@ -23,21 +24,10 @@ dependencies:
|
|
23
24
|
version: '0'
|
24
25
|
type: :runtime
|
25
26
|
prerelease: false
|
26
|
-
version_requirements: *
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: escape_utils
|
29
|
-
requirement: &2151828040 !ruby/object:Gem::Requirement
|
30
|
-
none: false
|
31
|
-
requirements:
|
32
|
-
- - ! '>='
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: '0'
|
35
|
-
type: :runtime
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: *2151828040
|
27
|
+
version_requirements: *2152912960
|
38
28
|
- !ruby/object:Gem::Dependency
|
39
29
|
name: rack-test
|
40
|
-
requirement: &
|
30
|
+
requirement: &2152911920 !ruby/object:Gem::Requirement
|
41
31
|
none: false
|
42
32
|
requirements:
|
43
33
|
- - ! '>='
|
@@ -45,10 +35,10 @@ dependencies:
|
|
45
35
|
version: '0'
|
46
36
|
type: :development
|
47
37
|
prerelease: false
|
48
|
-
version_requirements: *
|
38
|
+
version_requirements: *2152911920
|
49
39
|
- !ruby/object:Gem::Dependency
|
50
40
|
name: rspec
|
51
|
-
requirement: &
|
41
|
+
requirement: &2152909740 !ruby/object:Gem::Requirement
|
52
42
|
none: false
|
53
43
|
requirements:
|
54
44
|
- - ~>
|
@@ -56,11 +46,12 @@ dependencies:
|
|
56
46
|
version: '2.0'
|
57
47
|
type: :development
|
58
48
|
prerelease: false
|
59
|
-
version_requirements: *
|
49
|
+
version_requirements: *2152909740
|
60
50
|
description: You should use protection!
|
61
51
|
email:
|
62
52
|
- konstantin.mailinglists@googlemail.com
|
63
53
|
- coreyward@me.com
|
54
|
+
- dek-oss@gravitext.com
|
64
55
|
- developer@fojasaur.us
|
65
56
|
executables: []
|
66
57
|
extensions: []
|
@@ -118,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
109
|
version: '0'
|
119
110
|
requirements: []
|
120
111
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.8.
|
112
|
+
rubygems_version: 1.8.10
|
122
113
|
signing_key:
|
123
114
|
specification_version: 3
|
124
115
|
summary: You should use protection!
|