handle_invalid_percent_encoding_requests 1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 56cab74c5a0e7f605b50f13c78b65b8269195089
4
- data.tar.gz: b1565f7d1b34e9d0af3956294cc0d73494fde8f7
2
+ SHA256:
3
+ metadata.gz: 55d974e3fa4170de9c984b121d1e51f2c044206745fee018792503f0f0a14731
4
+ data.tar.gz: e90ccf94c95c2dda14a2e0702d14fe3c61c1956cf09f3b7251d77145247343b4
5
5
  SHA512:
6
- metadata.gz: ce964bf003c3381d3910e6b31ac100211a2359d1478294db128b6605ac9b6e10e0b6f0dfe6818ff939d1db4aaff25a4ceafc18c92553778bdc96731997c4d999
7
- data.tar.gz: 8a4bbeb963cf8e7478ef1053f332a99b07af08b6015af8af7a282797105849f5d900afdeb355fa9611f29ac9f2ed0d0a1335720b6034ea366e6f1314d56d7112
6
+ metadata.gz: b3ca91d7033ad2490901c33446e5457fd7c27920187efd241677e1478715e3e7fd3c3ce9c0c9817d9087604f94b4dec9335877e00e300920e4c6f2c1ef114304
7
+ data.tar.gz: 153849e5a033d14ecac4afc94fcff4d6b90094acad14246c17a2a143d35d01d51f0872070791c20ef98f5965106cf7559130c199054775c9d7d33f718343e9ac
data/README.md CHANGED
@@ -1,9 +1,28 @@
1
1
  Handle Invalid Percent Encoding Requests
2
2
  =======================================
3
3
 
4
- Rails Engine that renders 400 error whenever a request's
5
- percent-encoding is malformed.
4
+ Rails Engine that protects your app against malformed requests.
6
5
 
7
- This happens notably a lot for the chinese [EasouSpider](http://www.easou.com/search/spider.html).
6
+ This middleware renders a 400 error instead of raising exceptions for the
7
+ following errors:
8
8
 
9
- See http://stackoverflow.com/q/24648206/311657
9
+ - `invalid byte sequence in UTF-8`
10
+ - `string contains null byte`
11
+
12
+ Installation
13
+ ------------
14
+
15
+ In your Rails app, add these lines to your `Gemfile`:
16
+
17
+ ```rb
18
+ # Helps against "invalid byte sequence" exceptions.
19
+ gem "handle_invalid_percent_encoding_requests"
20
+ ```
21
+
22
+ Then type `bundle install`.
23
+
24
+ See also
25
+ --------
26
+
27
+ See also [Ruby on Rails “invalid byte sequence in UTF-8” due to
28
+ bot](http://stackoverflow.com/q/24648206/311657) on StackOverflow.
@@ -2,6 +2,7 @@ require "rack/utf8_sanitizer"
2
2
 
3
3
  module HandleInvalidPercentEncodingRequests
4
4
 
5
+ # Rails Engine that inserts the Middleware at the top of the Rack queue
5
6
  class Engine < Rails::Engine
6
7
  initializer "handle_invalid_percent_encoding_requests.add_middleware" do |app|
7
8
  # Via http://stackoverflow.com/a/24727310/311657
@@ -1,13 +1,35 @@
1
1
  # Via https://gist.github.com/bf4/d26259acfa29f3b9882b#file-exception_app-rb
2
-
3
2
  module HandleInvalidPercentEncodingRequests
3
+ module InvalidPercentEncodingErrorMatcher
4
+ def self.===(error)
5
+ error.is_a?(ArgumentError) &&
6
+ error.message =~ /invalid %-encoding/
7
+ end
8
+ end
4
9
 
10
+ module InvalidByteSequenceErrorMatcher
11
+ def self.===(error)
12
+ error.is_a?(ArgumentError) &&
13
+ error.message == "invalid byte sequence in UTF-8"
14
+ end
15
+ end
16
+
17
+ module NullByteErrorMatcher
18
+ def self.===(error)
19
+ error.is_a?(ArgumentError) &&
20
+ error.message == "string contains null byte"
21
+ end
22
+ end
23
+
24
+ # Rack Middleware inserted before the request that detects an encoding error
25
+ # and returns an appropriate response.
5
26
  class Middleware
6
- def initialize(app, stdout=STDOUT)
27
+ def initialize(app, stdout = STDOUT)
7
28
  @app = app
8
29
  @logger = defined?(Rails.logger) ? Rails.logger : Logger.new(stdout)
9
30
  end
10
31
 
32
+ # Called by Rack when a request comes through
11
33
  def call(env)
12
34
  # calling env.dup here prevents bad things from happening
13
35
  request = Rack::Request.new(env.dup)
@@ -15,11 +37,16 @@ module HandleInvalidPercentEncodingRequests
15
37
  # calling request.params is sufficient to trigger the error see
16
38
  # https://github.com/rack/rack/issues/337#issuecomment-46453404
17
39
  request.params
40
+
18
41
  @app.call(env)
19
42
 
20
- # Rescue from that specific ArgumentError
21
- rescue ArgumentError => e
22
- raise unless e.message =~ /invalid %-encoding/
43
+ rescue InvalidPercentEncodingErrorMatcher,
44
+ InvalidByteSequenceErrorMatcher,
45
+ NullByteErrorMatcher => e
46
+
47
+ @logger.info "Bad request. Returning 400 due to #{e.class.name} " \
48
+ "#{e.message.inspect} from request with env " \
49
+ "#{request.inspect}"
23
50
  error_response
24
51
  end
25
52
 
@@ -27,13 +54,9 @@ module HandleInvalidPercentEncodingRequests
27
54
  private
28
55
 
29
56
  def error_response
30
- @logger.info "Bad request. Returning 400 due to #{e.message}" + \
31
- " from request with env #{request.inspect}"
32
-
33
- headers = { 'Content-Type' => "text/plain; charset=utf-8" }
57
+ headers = { "Content-Type" => "text/plain; charset=utf-8" }
34
58
  text = "Bad Request"
35
59
  [400, headers, [text]]
36
60
  end
37
61
  end
38
-
39
62
  end
@@ -1,3 +1,4 @@
1
+ # Uses Semantic Versionning
1
2
  module HandleInvalidPercentEncodingRequests
2
- VERSION = 1.0
3
+ VERSION = "1.1.1"
3
4
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: handle_invalid_percent_encoding_requests
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sunny Ripert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-22 00:00:00.000000000 Z
11
+ date: 2022-02-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.1.4
19
+ version: '3.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.1.4
26
+ version: '3.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rack-utf8_sanitizer
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -59,13 +59,13 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - MIT-LICENSE
63
+ - README.md
64
+ - Rakefile
65
+ - lib/handle_invalid_percent_encoding_requests.rb
62
66
  - lib/handle_invalid_percent_encoding_requests/engine.rb
63
67
  - lib/handle_invalid_percent_encoding_requests/middleware.rb
64
68
  - lib/handle_invalid_percent_encoding_requests/version.rb
65
- - lib/handle_invalid_percent_encoding_requests.rb
66
- - MIT-LICENSE
67
- - Rakefile
68
- - README.md
69
69
  homepage: http://github.com/sunny/handle_invalid_percent_encoding_requests
70
70
  licenses:
71
71
  - MIT
@@ -85,8 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
85
  - !ruby/object:Gem::Version
86
86
  version: '0'
87
87
  requirements: []
88
- rubyforge_project:
89
- rubygems_version: 2.1.11
88
+ rubygems_version: 3.1.6
90
89
  signing_key:
91
90
  specification_version: 4
92
91
  summary: Handle invalid percent in encoding from requests in Rails