rack-smack 1.0.0
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +30 -0
- data/Rakefile +8 -0
- data/lib/rack-smack.rb +1 -0
- data/lib/rack/smack.rb +49 -0
- data/lib/rack/smack/version.rb +5 -0
- data/rack-smack.gemspec +29 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: caa16a9a96c5b7e93b65202887ad6d85f1208c16
|
4
|
+
data.tar.gz: 60f6f861038536c62a39351710c0ee236a29f613
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6e6e8bcff5b2a4684305fb8e39fb2b3cd9824dde306b1b76f19b7e697796ae8d266829c27ec6770cbd2ff4de4a6200b42f9c642d44c6279935e2cc7d1438e903
|
7
|
+
data.tar.gz: 5c09bf8cd44898f7537bff1bdcb27fac29c0115dec37a1ba1ffe3fa023bfa1ad43b744f0012e2d4269168bab29ee8c0feb4186a9f22b8b1a5151316aaebc6716
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# Rack::Smack
|
2
|
+
|
3
|
+
A no-nonsense force of good in a world of bad. Will prevent malicious bots/users from accessing your content once they are caught red-handed.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
Require `smack.rb` where you need it and the slide it into your middleware stack:
|
7
|
+
|
8
|
+
```
|
9
|
+
use Rack::Smack
|
10
|
+
```
|
11
|
+
|
12
|
+
## Options
|
13
|
+
`file` for filename storing the bad guys
|
14
|
+
`list` for the list of keywords you want to ban on
|
15
|
+
`asset` for the list of keywords where you want to skip checking
|
16
|
+
|
17
|
+
### Example with options
|
18
|
+
```
|
19
|
+
use Rack::Smack file: 'bad_guys.txt', list: ['wp', 'wordpress', php', 'admin']
|
20
|
+
```
|
21
|
+
|
22
|
+
## Defaults
|
23
|
+
|Option|Value|
|
24
|
+
|-|-|
|
25
|
+
|file|'./ban_list.txt'|
|
26
|
+
|list|['wp', 'wordpress', 'xmlrpc', 'sfn']|
|
27
|
+
|asset|['css', 'gif', 'jpg', 'jpeg', 'js', 'png', 'ico', 'txt']|
|
28
|
+
|
29
|
+
## Want to understand?
|
30
|
+
[Code overview](https://alessandrominali.github.io/block_malicious_users_with_rack_app)
|
data/Rakefile
ADDED
data/lib/rack-smack.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'rack/smack'
|
data/lib/rack/smack.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'rack/smack/version'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
# don't cross me boy
|
5
|
+
class Smack
|
6
|
+
ASSET = %w[css gif jpg jpeg js png ico txt].freeze
|
7
|
+
BLOCKED = %w[wp wordpress xmlrpc sfn].freeze
|
8
|
+
FILENAME = './ban_list.txt'.freeze
|
9
|
+
|
10
|
+
def initialize(app, opts = {})
|
11
|
+
@app = app
|
12
|
+
@asset = opts.delete(:asset) || ASSET
|
13
|
+
@blocked = opts.delete(:list) || BLOCKED
|
14
|
+
@file = opts.delete(:file) || FILENAME
|
15
|
+
raise TypeError unless options_valid?
|
16
|
+
IO.write(FILENAME, '') unless ::File.file?(@file)
|
17
|
+
end
|
18
|
+
|
19
|
+
def call(env)
|
20
|
+
@req = Rack::Request.new(env)
|
21
|
+
return @app.call(env) if @asset.include? @req.path.split('.')[-1]
|
22
|
+
return smack if banned?
|
23
|
+
return ban! if @blocked.any? { |block| @req.path.index(block) }
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def ban!
|
30
|
+
IO.write(@file, "#{@req.ip},#{@req.path},#{Time.now}\n", mode: 'a')
|
31
|
+
smack
|
32
|
+
end
|
33
|
+
|
34
|
+
def banned?
|
35
|
+
IO.foreach(@file) do |row|
|
36
|
+
return true if row.split(',')[0] == @req.ip
|
37
|
+
end
|
38
|
+
false
|
39
|
+
end
|
40
|
+
|
41
|
+
def options_valid?
|
42
|
+
@blocked.is_a?(Array) && @asset.is_a?(Array) && @file.is_a?(String)
|
43
|
+
end
|
44
|
+
|
45
|
+
def smack
|
46
|
+
[403, { 'Content-Type' => 'text/html' }, ['Banned.']]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/rack-smack.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'rack/smack/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'rack-smack'
|
9
|
+
spec.version = Rack::Smack::VERSION
|
10
|
+
spec.authors = ['AlessandroMinali']
|
11
|
+
spec.email = ['alessandro.minali@gmail.com']
|
12
|
+
|
13
|
+
spec.summary = 'A no-nonsense force of good in a world of bad. Will prevent malicious bots/users from accessing your content once they are caught red-handed.'
|
14
|
+
spec.homepage = 'https://github.com/AlessandroMinali/rack-smack'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
+
f.match(%r{^(test|spec|features)/})
|
19
|
+
end
|
20
|
+
spec.bindir = 'exe'
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ['lib']
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.15'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.2'
|
27
|
+
spec.add_development_dependency 'rack-test'
|
28
|
+
spec.add_development_dependency 'pry'
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-smack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- AlessandroMinali
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.15'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.15'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.2'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-test
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- alessandro.minali@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
92
|
+
- Gemfile
|
93
|
+
- LICENSE.txt
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/rack-smack.rb
|
97
|
+
- lib/rack/smack.rb
|
98
|
+
- lib/rack/smack/version.rb
|
99
|
+
- rack-smack.gemspec
|
100
|
+
homepage: https://github.com/AlessandroMinali/rack-smack
|
101
|
+
licenses:
|
102
|
+
- MIT
|
103
|
+
metadata: {}
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
requirements: []
|
119
|
+
rubyforge_project:
|
120
|
+
rubygems_version: 2.6.12
|
121
|
+
signing_key:
|
122
|
+
specification_version: 4
|
123
|
+
summary: A no-nonsense force of good in a world of bad. Will prevent malicious bots/users
|
124
|
+
from accessing your content once they are caught red-handed.
|
125
|
+
test_files: []
|