brakeman-lib 5.0.0 → 5.1.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 +4 -4
- data/CHANGES.md +46 -0
- data/README.md +10 -1
- data/lib/brakeman.rb +23 -8
- data/lib/brakeman/checks/check_detailed_exceptions.rb +1 -1
- data/lib/brakeman/checks/check_evaluation.rb +1 -1
- data/lib/brakeman/checks/check_execute.rb +10 -0
- data/lib/brakeman/checks/check_mass_assignment.rb +4 -6
- data/lib/brakeman/checks/check_render.rb +15 -1
- data/lib/brakeman/checks/check_sanitize_methods.rb +2 -1
- data/lib/brakeman/checks/check_sql.rb +58 -8
- data/lib/brakeman/checks/check_verb_confusion.rb +1 -1
- data/lib/brakeman/commandline.rb +1 -1
- data/lib/brakeman/file_parser.rb +45 -15
- data/lib/brakeman/options.rb +7 -2
- data/lib/brakeman/parsers/template_parser.rb +24 -0
- data/lib/brakeman/processors/alias_processor.rb +105 -18
- data/lib/brakeman/processors/base_processor.rb +4 -4
- data/lib/brakeman/processors/controller_alias_processor.rb +6 -43
- data/lib/brakeman/processors/lib/call_conversion_helper.rb +10 -6
- data/lib/brakeman/processors/lib/rails4_config_processor.rb +2 -1
- data/lib/brakeman/processors/library_processor.rb +9 -0
- data/lib/brakeman/processors/model_processor.rb +31 -0
- data/lib/brakeman/report.rb +4 -1
- data/lib/brakeman/report/ignore/config.rb +4 -4
- data/lib/brakeman/report/ignore/interactive.rb +1 -1
- data/lib/brakeman/report/report_github.rb +31 -0
- data/lib/brakeman/report/report_sarif.rb +21 -2
- data/lib/brakeman/rescanner.rb +1 -1
- data/lib/brakeman/scanner.rb +4 -1
- data/lib/brakeman/tracker.rb +33 -4
- data/lib/brakeman/tracker/collection.rb +57 -7
- data/lib/brakeman/tracker/method_info.rb +70 -0
- data/lib/brakeman/util.rb +34 -18
- data/lib/brakeman/version.rb +1 -1
- data/lib/ruby_parser/bm_sexp.rb +14 -0
- metadata +18 -2
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'brakeman/util'
|
2
|
+
|
3
|
+
module Brakeman
|
4
|
+
class MethodInfo
|
5
|
+
include Brakeman::Util
|
6
|
+
|
7
|
+
attr_reader :name, :src, :owner, :file, :type
|
8
|
+
|
9
|
+
def initialize name, src, owner, file
|
10
|
+
@name = name
|
11
|
+
@src = src
|
12
|
+
@owner = owner
|
13
|
+
@file = file
|
14
|
+
@type = case src.node_type
|
15
|
+
when :defn
|
16
|
+
:instance
|
17
|
+
when :defs
|
18
|
+
:class
|
19
|
+
else
|
20
|
+
raise "Expected sexp type: #{src.node_type}"
|
21
|
+
end
|
22
|
+
|
23
|
+
@simple_method = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# To support legacy code that expected a Hash
|
27
|
+
def [] attr
|
28
|
+
self.send(attr)
|
29
|
+
end
|
30
|
+
|
31
|
+
def very_simple_method?
|
32
|
+
return @simple_method == :very unless @simple_method.nil?
|
33
|
+
|
34
|
+
# Very simple methods have one (simple) expression in the body and
|
35
|
+
# no arguments
|
36
|
+
if src.formal_args.length == 1 # no args
|
37
|
+
if src.method_length == 1 # Single expression in body
|
38
|
+
value = first_body # First expression in body
|
39
|
+
|
40
|
+
if simple_literal? value or
|
41
|
+
(array? value and all_literals? value) or
|
42
|
+
(hash? value and all_literals? value, :hash)
|
43
|
+
|
44
|
+
@return_value = value
|
45
|
+
@simple_method = :very
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
@simple_method ||= false
|
51
|
+
end
|
52
|
+
|
53
|
+
def return_value env = nil
|
54
|
+
if very_simple_method?
|
55
|
+
return @return_value
|
56
|
+
else
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def first_body
|
62
|
+
case @type
|
63
|
+
when :class
|
64
|
+
src[4]
|
65
|
+
when :instance
|
66
|
+
src[3]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/brakeman/util.rb
CHANGED
@@ -50,7 +50,11 @@ module Brakeman::Util
|
|
50
50
|
|
51
51
|
# stupid simple, used to delegate to ActiveSupport
|
52
52
|
def pluralize word
|
53
|
-
word
|
53
|
+
if word.end_with? 's'
|
54
|
+
word + 'es'
|
55
|
+
else
|
56
|
+
word + 's'
|
57
|
+
end
|
54
58
|
end
|
55
59
|
|
56
60
|
#Returns a class name as a Symbol.
|
@@ -142,6 +146,14 @@ module Brakeman::Util
|
|
142
146
|
nil
|
143
147
|
end
|
144
148
|
|
149
|
+
def hash_values hash
|
150
|
+
values = hash.each_sexp.each_slice(2).map do |_, value|
|
151
|
+
value
|
152
|
+
end
|
153
|
+
|
154
|
+
Sexp.new(:array).concat(values).line(hash.line)
|
155
|
+
end
|
156
|
+
|
145
157
|
#These are never modified
|
146
158
|
PARAMS_SEXP = Sexp.new(:params)
|
147
159
|
SESSION_SEXP = Sexp.new(:session)
|
@@ -230,30 +242,22 @@ module Brakeman::Util
|
|
230
242
|
|
231
243
|
#Check if _exp_ is a params hash
|
232
244
|
def params? exp
|
233
|
-
|
234
|
-
return true if exp.node_type == :params or ALL_PARAMETERS.include? exp
|
235
|
-
|
236
|
-
if call? exp
|
237
|
-
if params? exp[1]
|
238
|
-
return true
|
239
|
-
elsif exp[2] == :[]
|
240
|
-
return params? exp[1]
|
241
|
-
end
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
false
|
245
|
+
recurse_check?(exp) { |child| child.node_type == :params or ALL_PARAMETERS.include? child }
|
246
246
|
end
|
247
247
|
|
248
248
|
def cookies? exp
|
249
|
+
recurse_check?(exp) { |child| child.node_type == :cookies or ALL_COOKIES.include? child }
|
250
|
+
end
|
251
|
+
|
252
|
+
def recurse_check? exp, &check
|
249
253
|
if exp.is_a? Sexp
|
250
|
-
return true if exp
|
254
|
+
return true if yield(exp)
|
251
255
|
|
252
256
|
if call? exp
|
253
|
-
if
|
257
|
+
if recurse_check? exp[1], &check
|
254
258
|
return true
|
255
259
|
elsif exp[2] == :[]
|
256
|
-
return
|
260
|
+
return recurse_check? exp[1], &check
|
257
261
|
end
|
258
262
|
end
|
259
263
|
end
|
@@ -293,12 +297,24 @@ module Brakeman::Util
|
|
293
297
|
exp.is_a? Sexp and types.include? exp.node_type
|
294
298
|
end
|
295
299
|
|
296
|
-
|
300
|
+
SIMPLE_LITERALS = [:lit, :false, :str, :true]
|
301
|
+
|
302
|
+
def simple_literal? exp
|
303
|
+
exp.is_a? Sexp and SIMPLE_LITERALS.include? exp.node_type
|
304
|
+
end
|
305
|
+
|
306
|
+
LITERALS = [*SIMPLE_LITERALS, :array, :hash]
|
297
307
|
|
298
308
|
def literal? exp
|
299
309
|
exp.is_a? Sexp and LITERALS.include? exp.node_type
|
300
310
|
end
|
301
311
|
|
312
|
+
def all_literals? exp, expected_type = :array
|
313
|
+
node_type? exp, expected_type and
|
314
|
+
exp.length > 1 and
|
315
|
+
exp.all? { |e| e.is_a? Symbol or node_type? e, :lit, :str }
|
316
|
+
end
|
317
|
+
|
302
318
|
DIR_CONST = s(:const, :Dir)
|
303
319
|
|
304
320
|
# Dir.glob(...).whatever
|
data/lib/brakeman/version.rb
CHANGED
data/lib/ruby_parser/bm_sexp.rb
CHANGED
@@ -543,6 +543,20 @@ class Sexp
|
|
543
543
|
self.body.unshift :rlist
|
544
544
|
end
|
545
545
|
|
546
|
+
# Number of "statements" in a method.
|
547
|
+
# This is more effecient than `Sexp#body.length`
|
548
|
+
# because `Sexp#body` creates a new Sexp.
|
549
|
+
def method_length
|
550
|
+
expect :defn, :defs
|
551
|
+
|
552
|
+
case self.node_type
|
553
|
+
when :defn
|
554
|
+
self.length - 3
|
555
|
+
when :defs
|
556
|
+
self.length - 4
|
557
|
+
end
|
558
|
+
end
|
559
|
+
|
546
560
|
def render_type
|
547
561
|
expect :render
|
548
562
|
self[1]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman-lib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Collins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.10.2
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: parallel
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.20'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.20'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: ruby_parser
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -380,6 +394,7 @@ files:
|
|
380
394
|
- lib/brakeman/report/report_base.rb
|
381
395
|
- lib/brakeman/report/report_codeclimate.rb
|
382
396
|
- lib/brakeman/report/report_csv.rb
|
397
|
+
- lib/brakeman/report/report_github.rb
|
383
398
|
- lib/brakeman/report/report_hash.rb
|
384
399
|
- lib/brakeman/report/report_html.rb
|
385
400
|
- lib/brakeman/report/report_json.rb
|
@@ -409,6 +424,7 @@ files:
|
|
409
424
|
- lib/brakeman/tracker/constants.rb
|
410
425
|
- lib/brakeman/tracker/controller.rb
|
411
426
|
- lib/brakeman/tracker/library.rb
|
427
|
+
- lib/brakeman/tracker/method_info.rb
|
412
428
|
- lib/brakeman/tracker/model.rb
|
413
429
|
- lib/brakeman/tracker/template.rb
|
414
430
|
- lib/brakeman/util.rb
|