brakeman-min 3.3.0 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGES +11 -0
- data/README.md +3 -2
- data/lib/brakeman.rb +21 -12
- data/lib/brakeman/checks/check_sql.rb +3 -3
- data/lib/brakeman/checks/check_validation_regex.rb +31 -3
- data/lib/brakeman/options.rb +4 -0
- data/lib/brakeman/parsers/rails3_erubis.rb +43 -23
- data/lib/brakeman/processors/alias_processor.rb +5 -0
- data/lib/brakeman/processors/base_processor.rb +2 -8
- data/lib/brakeman/processors/erb_template_processor.rb +1 -5
- data/lib/brakeman/processors/erubis_template_processor.rb +16 -10
- data/lib/brakeman/processors/haml_template_processor.rb +4 -2
- data/lib/brakeman/processors/lib/basic_processor.rb +2 -16
- data/lib/brakeman/processors/lib/safe_call_helper.rb +16 -0
- data/lib/brakeman/processors/output_processor.rb +1 -1
- data/lib/brakeman/processors/slim_template_processor.rb +1 -5
- data/lib/brakeman/processors/template_processor.rb +19 -0
- data/lib/brakeman/rescanner.rb +2 -1
- data/lib/brakeman/scanner.rb +2 -4
- data/lib/brakeman/tracker.rb +0 -9
- data/lib/brakeman/tracker/collection.rb +4 -0
- data/lib/brakeman/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0908b7c2b06cb913a06b7857e223ae7845c48036
|
4
|
+
data.tar.gz: 8b162cfe56b7acd0f4717d524c6e7ee1e5b8b516
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75ee0836a37948d3f4a8c6e0a639cbe20bd950897440de02375121133ae81f0f708bf92202a85540d068f3c04510a92a95a92155fe6e4bffc851b79cfd44c9fc
|
7
|
+
data.tar.gz: 97275a73c3804586be1c676584a8367403dca3ef043c8a1ec8064925a21cc28089aca9c44af1c51ac0eb8aa1b539a67303dda25862994749659939682e3587cf
|
data/CHANGES
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 3.3.1
|
2
|
+
|
3
|
+
* Delay loading vendored gems and modifying load path
|
4
|
+
* Avoid warning about SQL injection with `quoted_primary_key`
|
5
|
+
* Support more safe `&.` operations
|
6
|
+
* Allow multile line regex in `validates_format_of` (Dmitrij Fedorenko)
|
7
|
+
* Only consider `if` branches in templates
|
8
|
+
* Avoid overwriting instance/class methods with same name (Tim Wade)
|
9
|
+
* Add `--force-scan` option (Neil Matatall)
|
10
|
+
* Improved line number accuracy in ERB templates (Patrick Toomey)
|
11
|
+
|
1
12
|
# 3.3.0
|
2
13
|
|
3
14
|
* Skip processing obviously false if branches (more broadly)
|
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
[![Brakeman Logo](http://brakemanscanner.org/images/logo_medium.png)](http://brakemanscanner.org/)
|
2
|
+
[![Brakeman Pro Logo](https://brakemanpro.com/images/bmp_square_white.png)](https://brakemanpro.com)
|
2
3
|
|
3
4
|
[![Build Status](https://travis-ci.org/presidentbeef/brakeman.svg?branch=master)](https://travis-ci.org/presidentbeef/brakeman)
|
4
5
|
[![Code Climate](https://codeclimate.com/github/presidentbeef/brakeman/badges/gpa.svg)](https://codeclimate.com/github/presidentbeef/brakeman)
|
@@ -159,9 +160,9 @@ For even more continuous testing, try the [Guard plugin](https://github.com/guar
|
|
159
160
|
|
160
161
|
Website: http://brakemanscanner.org/
|
161
162
|
|
162
|
-
Twitter:
|
163
|
+
Twitter: https://twitter.com/brakeman
|
163
164
|
|
164
|
-
|
165
|
+
Chat: https://gitter.im/presidentbeef/brakeman
|
165
166
|
|
166
167
|
# License
|
167
168
|
|
data/lib/brakeman.rb
CHANGED
@@ -1,11 +1,5 @@
|
|
1
1
|
require 'set'
|
2
2
|
|
3
|
-
path_load = "#{File.expand_path(File.dirname(__FILE__))}/../bundle/load.rb"
|
4
|
-
|
5
|
-
if File.exist? path_load
|
6
|
-
require path_load
|
7
|
-
end
|
8
|
-
|
9
3
|
module Brakeman
|
10
4
|
|
11
5
|
#This exit code is used when warnings are found and the --exit-on-warn
|
@@ -18,6 +12,7 @@ module Brakeman
|
|
18
12
|
@debug = false
|
19
13
|
@quiet = false
|
20
14
|
@loaded_dependencies = []
|
15
|
+
@vendored_paths = false
|
21
16
|
|
22
17
|
#Run Brakeman scan. Returns Tracker object.
|
23
18
|
#
|
@@ -101,7 +96,7 @@ module Brakeman
|
|
101
96
|
#Load configuration file
|
102
97
|
if config = config_file(custom_location, app_path)
|
103
98
|
require 'date' # https://github.com/dtao/safe_yaml/issues/80
|
104
|
-
|
99
|
+
self.load_brakeman_dependency 'safe_yaml/load'
|
105
100
|
options = SafeYAML.load_file config, :deserialize_symbols => true
|
106
101
|
|
107
102
|
if options
|
@@ -167,7 +162,7 @@ module Brakeman
|
|
167
162
|
get_formats_from_output_files options[:output_files]
|
168
163
|
else
|
169
164
|
begin
|
170
|
-
|
165
|
+
self.load_brakeman_dependency 'terminal-table', :allow_fail
|
171
166
|
return [:to_s]
|
172
167
|
rescue LoadError
|
173
168
|
return [:to_json]
|
@@ -433,15 +428,29 @@ module Brakeman
|
|
433
428
|
Brakeman::Differ.new(new_results, previous_results).diff
|
434
429
|
end
|
435
430
|
|
436
|
-
def self.load_brakeman_dependency name
|
431
|
+
def self.load_brakeman_dependency name, allow_fail = false
|
437
432
|
return if @loaded_dependencies.include? name
|
438
433
|
|
434
|
+
unless @vendored_paths
|
435
|
+
path_load = "#{File.expand_path(File.dirname(__FILE__))}/../bundle/load.rb"
|
436
|
+
|
437
|
+
if File.exist? path_load
|
438
|
+
require path_load
|
439
|
+
end
|
440
|
+
|
441
|
+
@vendored_paths = true
|
442
|
+
end
|
443
|
+
|
439
444
|
begin
|
440
445
|
require name
|
441
446
|
rescue LoadError => e
|
442
|
-
|
443
|
-
|
444
|
-
|
447
|
+
if allow_fail
|
448
|
+
raise e
|
449
|
+
else
|
450
|
+
$stderr.puts e.message
|
451
|
+
$stderr.puts "Please install the appropriate dependency: #{name}."
|
452
|
+
exit!(-1)
|
453
|
+
end
|
445
454
|
end
|
446
455
|
end
|
447
456
|
|
@@ -545,9 +545,9 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
545
545
|
string_building? exp.first_arg
|
546
546
|
end
|
547
547
|
|
548
|
-
IGNORE_METHODS_IN_SQL = Set[:id, :merge_conditions, :table_name, :quoted_table_name,
|
549
|
-
:
|
550
|
-
:sanitize_sql_for_conditions, :sanitize_sql_hash,
|
548
|
+
IGNORE_METHODS_IN_SQL = Set[:id, :merge_conditions, :table_name, :quoted_table_name,
|
549
|
+
:quoted_primary_key, :to_i, :to_f, :sanitize_sql, :sanitize_sql_array,
|
550
|
+
:sanitize_sql_for_assignment, :sanitize_sql_for_conditions, :sanitize_sql_hash,
|
551
551
|
:sanitize_sql_hash_for_assignment, :sanitize_sql_hash_for_conditions,
|
552
552
|
:to_sql, :sanitize, :primary_key, :table_name_prefix, :table_name_suffix]
|
553
553
|
|
@@ -59,17 +59,37 @@ class Brakeman::CheckValidationRegex < Brakeman::BaseCheck
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
# Match secure regexp without extended option
|
63
|
+
SECURE_REGEXP_PATTERN = %r{
|
64
|
+
\A
|
65
|
+
\\A
|
66
|
+
.*
|
67
|
+
\\[zZ]
|
68
|
+
\z
|
69
|
+
}x
|
70
|
+
|
71
|
+
# Match secure of regexp with extended option
|
72
|
+
EXTENDED_SECURE_REGEXP_PATTERN = %r{
|
73
|
+
\A
|
74
|
+
\s*
|
75
|
+
\\A
|
76
|
+
.*
|
77
|
+
\\[zZ]
|
78
|
+
\s*
|
79
|
+
\z
|
80
|
+
}mx
|
81
|
+
|
62
82
|
#Issue warning if the regular expression does not use
|
63
83
|
#+\A+ and +\z+
|
64
84
|
def check_regex value, validator
|
65
85
|
return unless regexp? value
|
66
86
|
|
67
|
-
regex = value.value
|
68
|
-
unless regex
|
87
|
+
regex = value.value
|
88
|
+
unless secure_regex?(regex)
|
69
89
|
warn :model => @current_model,
|
70
90
|
:warning_type => "Format Validation",
|
71
91
|
:warning_code => :validation_regex,
|
72
|
-
:message => "Insufficient validation for '#{get_name validator}' using #{regex}. Use \\A and \\z as anchors",
|
92
|
+
:message => "Insufficient validation for '#{get_name validator}' using #{regex.inspect}. Use \\A and \\z as anchors",
|
73
93
|
:line => value.line,
|
74
94
|
:confidence => CONFIDENCE[:high]
|
75
95
|
end
|
@@ -85,4 +105,12 @@ class Brakeman::CheckValidationRegex < Brakeman::BaseCheck
|
|
85
105
|
name
|
86
106
|
end
|
87
107
|
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
def secure_regex?(regex)
|
112
|
+
extended_regex = Regexp::EXTENDED == regex.options & Regexp::EXTENDED
|
113
|
+
regex_pattern = extended_regex ? EXTENDED_SECURE_REGEXP_PATTERN : SECURE_REGEXP_PATTERN
|
114
|
+
regex_pattern =~ regex.source
|
115
|
+
end
|
88
116
|
end
|
data/lib/brakeman/options.rb
CHANGED
@@ -276,6 +276,10 @@ module Brakeman::Options
|
|
276
276
|
options[:show_version] = true
|
277
277
|
end
|
278
278
|
|
279
|
+
opts.on "--force-scan", "Scan application even if rails is not detected" do
|
280
|
+
options[:force_scan] = true
|
281
|
+
end
|
282
|
+
|
279
283
|
opts.on_tail "-h", "--help", "Display this message" do
|
280
284
|
options[:show_help] = true
|
281
285
|
end
|
@@ -1,54 +1,74 @@
|
|
1
1
|
Brakeman.load_brakeman_dependency 'erubis'
|
2
2
|
|
3
|
-
#This is from Rails
|
3
|
+
# This is from Rails 5 version of the Erubis handler
|
4
|
+
# https://github.com/rails/rails/blob/ec608107801b1e505db03ba76bae4a326a5804ca/actionview/lib/action_view/template/handlers/erb.rb#L7-L73
|
4
5
|
class Brakeman::Rails3Erubis < ::Erubis::Eruby
|
5
6
|
|
6
7
|
def add_preamble(src)
|
7
|
-
|
8
|
+
@newline_pending = 0
|
9
|
+
src << "@output_buffer = output_buffer || ActionView::OutputBuffer.new;"
|
8
10
|
end
|
9
11
|
|
10
|
-
#This is different from Rails 3 - fixes some line number issues
|
11
12
|
def add_text(src, text)
|
13
|
+
return if text.empty?
|
14
|
+
|
12
15
|
if text == "\n"
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
if
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
@newline_pending += 1
|
17
|
+
else
|
18
|
+
src << "@output_buffer.safe_append='"
|
19
|
+
src << "\n" * @newline_pending if @newline_pending > 0
|
20
|
+
src << escape_text(text)
|
21
|
+
src << "'.freeze;"
|
22
|
+
|
23
|
+
@newline_pending = 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Erubis toggles <%= and <%== behavior when escaping is enabled.
|
28
|
+
# We override to always treat <%== as escaped.
|
29
|
+
def add_expr(src, code, indicator)
|
30
|
+
case indicator
|
31
|
+
when '=='
|
32
|
+
add_expr_escaped(src, code)
|
27
33
|
else
|
28
|
-
|
34
|
+
super
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
32
38
|
BLOCK_EXPR = /\s*((\s+|\))do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
33
39
|
|
34
40
|
def add_expr_literal(src, code)
|
41
|
+
flush_newline_if_pending(src)
|
35
42
|
if code =~ BLOCK_EXPR
|
36
43
|
src << '@output_buffer.append= ' << code
|
37
44
|
else
|
38
|
-
src << '@output_buffer.append=
|
45
|
+
src << '@output_buffer.append=(' << code << ');'
|
39
46
|
end
|
40
47
|
end
|
41
48
|
|
42
49
|
def add_expr_escaped(src, code)
|
50
|
+
flush_newline_if_pending(src)
|
43
51
|
if code =~ BLOCK_EXPR
|
44
|
-
src << "@output_buffer.
|
52
|
+
src << "@output_buffer.safe_expr_append= " << code
|
45
53
|
else
|
46
|
-
src << "@output_buffer.
|
54
|
+
src << "@output_buffer.safe_expr_append=(" << code << ");"
|
47
55
|
end
|
48
56
|
end
|
49
57
|
|
50
|
-
|
58
|
+
def add_stmt(src, code)
|
59
|
+
flush_newline_if_pending(src)
|
60
|
+
super
|
61
|
+
end
|
62
|
+
|
51
63
|
def add_postamble(src)
|
52
|
-
|
64
|
+
flush_newline_if_pending(src)
|
65
|
+
src << '@output_buffer.to_s'
|
66
|
+
end
|
67
|
+
|
68
|
+
def flush_newline_if_pending(src)
|
69
|
+
if @newline_pending > 0
|
70
|
+
src << "@output_buffer.safe_append='#{"\n" * @newline_pending}'.freeze;"
|
71
|
+
@newline_pending = 0
|
72
|
+
end
|
53
73
|
end
|
54
74
|
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
require 'brakeman/util'
|
2
2
|
require 'ruby_parser/bm_sexp_processor'
|
3
3
|
require 'brakeman/processors/lib/processor_helper'
|
4
|
+
require 'brakeman/processors/lib/safe_call_helper'
|
4
5
|
|
5
6
|
#Returns an s-expression with aliases replaced with their value.
|
6
7
|
#This does not preserve semantics (due to side effects, etc.), but it makes
|
7
8
|
#processing easier when searching for various things.
|
8
9
|
class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
9
10
|
include Brakeman::ProcessorHelper
|
11
|
+
include Brakeman::SafeCallHelper
|
10
12
|
include Brakeman::Util
|
11
13
|
|
12
14
|
attr_reader :result, :tracker
|
@@ -94,6 +96,9 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
|
|
94
96
|
return exp if process_call_defn? exp
|
95
97
|
target_var = exp.target
|
96
98
|
target_var &&= target_var.deep_clone
|
99
|
+
if exp.node_type == :safe_call
|
100
|
+
exp.node_type = :call
|
101
|
+
end
|
97
102
|
exp = process_default exp
|
98
103
|
|
99
104
|
#In case it is replaced with something else
|
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'brakeman/processors/lib/processor_helper'
|
2
|
+
require 'brakeman/processors/lib/safe_call_helper'
|
2
3
|
require 'brakeman/util'
|
3
4
|
|
4
5
|
#Base processor for most processors.
|
5
6
|
class Brakeman::BaseProcessor < Brakeman::SexpProcessor
|
6
7
|
include Brakeman::ProcessorHelper
|
8
|
+
include Brakeman::SafeCallHelper
|
7
9
|
include Brakeman::Util
|
8
10
|
|
9
11
|
IGNORE = Sexp.new :ignore
|
@@ -83,14 +85,6 @@ class Brakeman::BaseProcessor < Brakeman::SexpProcessor
|
|
83
85
|
call
|
84
86
|
end
|
85
87
|
|
86
|
-
def process_safe_call exp
|
87
|
-
if self.respond_to? :process_call
|
88
|
-
process_call exp
|
89
|
-
else
|
90
|
-
process_default exp
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
88
|
#String with interpolation.
|
95
89
|
def process_dstr exp
|
96
90
|
exp = exp.dup
|
@@ -23,11 +23,7 @@ class Brakeman::ErbTemplateProcessor < Brakeman::TemplateProcessor
|
|
23
23
|
raise "Did not expect more than a single argument to _erbout.concat"
|
24
24
|
end
|
25
25
|
|
26
|
-
arg = exp.first_arg
|
27
|
-
|
28
|
-
if call? arg and arg.method == :to_s #erb always calls to_s on output
|
29
|
-
arg = arg.target
|
30
|
-
end
|
26
|
+
arg = normalize_output(exp.first_arg)
|
31
27
|
|
32
28
|
if arg.node_type == :str #ignore plain strings
|
33
29
|
ignore
|
@@ -2,7 +2,7 @@ require 'brakeman/processors/template_processor'
|
|
2
2
|
|
3
3
|
#Processes ERB templates using Erubis instead of erb.
|
4
4
|
class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
5
|
-
|
5
|
+
|
6
6
|
#s(:call, TARGET, :method, ARGS)
|
7
7
|
def process_call exp
|
8
8
|
target = exp.target
|
@@ -18,12 +18,7 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
18
18
|
if node_type?(target, :lvar, :ivar) and (target.value == :_buf or target.value == :@output_buffer)
|
19
19
|
if method == :<< or method == :safe_concat
|
20
20
|
|
21
|
-
arg = exp.first_arg
|
22
|
-
|
23
|
-
#We want the actual content
|
24
|
-
if call? arg and (arg.method == :to_s or arg.method == :html_safe!)
|
25
|
-
arg = arg.target
|
26
|
-
end
|
21
|
+
arg = normalize_output(exp.first_arg)
|
27
22
|
|
28
23
|
if arg.node_type == :str #ignore plain strings
|
29
24
|
ignore
|
@@ -70,14 +65,16 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
70
65
|
#Look for assignments to output buffer that look like this:
|
71
66
|
# @output_buffer.append = some_output
|
72
67
|
# @output_buffer.safe_append = some_output
|
68
|
+
# @output_buffer.safe_expr_append = some_output
|
73
69
|
def process_attrasgn exp
|
74
70
|
if exp.target.node_type == :ivar and exp.target.value == :@output_buffer
|
75
|
-
if exp.method
|
76
|
-
|
71
|
+
if append_method?(exp.method)
|
72
|
+
exp.first_arg = process(exp.first_arg)
|
73
|
+
arg = normalize_output(exp.first_arg)
|
77
74
|
|
78
75
|
if arg.node_type == :str
|
79
76
|
ignore
|
80
|
-
elsif exp.method
|
77
|
+
elsif safe_append_method?(exp.method)
|
81
78
|
s = Sexp.new :output, arg
|
82
79
|
s.line(exp.line)
|
83
80
|
@current_template.add_output s
|
@@ -95,4 +92,13 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
95
92
|
super
|
96
93
|
end
|
97
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
def append_method?(method)
|
98
|
+
method == :append= || safe_append_method?(method)
|
99
|
+
end
|
100
|
+
|
101
|
+
def safe_append_method?(method)
|
102
|
+
method == :safe_append= || method == :safe_expr_append=
|
103
|
+
end
|
98
104
|
end
|
@@ -29,7 +29,8 @@ class Brakeman::HamlTemplateProcessor < Brakeman::TemplateProcessor
|
|
29
29
|
|
30
30
|
if arg
|
31
31
|
@inside_concat = true
|
32
|
-
|
32
|
+
exp.first_arg = process(arg)
|
33
|
+
out = normalize_output(exp.first_arg)
|
33
34
|
@inside_concat = false
|
34
35
|
else
|
35
36
|
raise "Empty _hamlout.#{method}()?"
|
@@ -73,7 +74,8 @@ class Brakeman::HamlTemplateProcessor < Brakeman::TemplateProcessor
|
|
73
74
|
#Has something to do with values of blocks?
|
74
75
|
elsif sexp? target and method == :<< and is_buffer_target? target
|
75
76
|
@inside_concat = true
|
76
|
-
|
77
|
+
exp.first_arg = process(exp.first_arg)
|
78
|
+
out = normalize_output(exp.first_arg)
|
77
79
|
@inside_concat = false
|
78
80
|
|
79
81
|
if out.node_type == :str #ignore plain strings
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'brakeman/processors/lib/processor_helper'
|
2
|
+
require 'brakeman/processors/lib/safe_call_helper'
|
2
3
|
require 'brakeman/util'
|
3
4
|
|
4
5
|
class Brakeman::BasicProcessor < Brakeman::SexpProcessor
|
5
6
|
include Brakeman::ProcessorHelper
|
7
|
+
include Brakeman::SafeCallHelper
|
6
8
|
include Brakeman::Util
|
7
9
|
|
8
10
|
def initialize tracker
|
@@ -15,22 +17,6 @@ class Brakeman::BasicProcessor < Brakeman::SexpProcessor
|
|
15
17
|
process_all exp
|
16
18
|
end
|
17
19
|
|
18
|
-
def process_safe_call exp
|
19
|
-
if self.respond_to? :process_call
|
20
|
-
process_call exp
|
21
|
-
else
|
22
|
-
process_default exp
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def process_safe_attrasgn exp
|
27
|
-
if self.respond_to? :process_attrasgn
|
28
|
-
process_attrasgn exp
|
29
|
-
else
|
30
|
-
process_default exp
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
20
|
def process_if exp
|
35
21
|
condition = exp.condition
|
36
22
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Brakeman
|
2
|
+
module SafeCallHelper
|
3
|
+
[[:process_safe_call, :process_call],
|
4
|
+
[:process_safe_attrasgn, :process_attrasgn],
|
5
|
+
[:process_safe_op_asgn, :process_op_asgn],
|
6
|
+
[:process_safe_op_asgn2, :process_op_asgn2]].each do |call, replacement|
|
7
|
+
define_method(call) do |exp|
|
8
|
+
if self.respond_to? replacement
|
9
|
+
self.send(replacement, exp)
|
10
|
+
else
|
11
|
+
process_default exp
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -13,11 +13,7 @@ class Brakeman::SlimTemplateProcessor < Brakeman::TemplateProcessor
|
|
13
13
|
method = exp.method
|
14
14
|
|
15
15
|
if method == :safe_concat and (target == SAFE_BUFFER or target == OUTPUT_BUFFER)
|
16
|
-
arg = exp.first_arg
|
17
|
-
|
18
|
-
if call? arg and arg.method == :to_s
|
19
|
-
arg = arg.target
|
20
|
-
end
|
16
|
+
arg = normalize_output(exp.first_arg)
|
21
17
|
|
22
18
|
if is_escaped? arg
|
23
19
|
make_escaped_output arg
|
@@ -52,4 +52,23 @@ class Brakeman::TemplateProcessor < Brakeman::BaseProcessor
|
|
52
52
|
def process_escaped_output exp
|
53
53
|
process_output exp
|
54
54
|
end
|
55
|
+
|
56
|
+
# Pull out actual output value from template
|
57
|
+
def normalize_output arg
|
58
|
+
if call? arg and [:to_s, :html_safe!, :freeze].include? arg.method
|
59
|
+
arg.target
|
60
|
+
elsif node_type? arg, :if
|
61
|
+
branches = [arg.then_clause, arg.else_clause].compact
|
62
|
+
|
63
|
+
if branches.empty?
|
64
|
+
s(:nil)
|
65
|
+
elsif branches.length == 2
|
66
|
+
Sexp.new(:or, *branches)
|
67
|
+
else
|
68
|
+
branches.first
|
69
|
+
end
|
70
|
+
else
|
71
|
+
arg
|
72
|
+
end
|
73
|
+
end
|
55
74
|
end
|
data/lib/brakeman/rescanner.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'brakeman/scanner'
|
2
|
-
require 'terminal-table'
|
3
2
|
require 'brakeman/util'
|
4
3
|
require 'brakeman/differ'
|
5
4
|
|
@@ -449,6 +448,8 @@ class Brakeman::RescanReport
|
|
449
448
|
|
450
449
|
#Output total, fixed, and new warnings
|
451
450
|
def to_s(verbose = false)
|
451
|
+
Brakeman.load_brakeman_dependency 'terminal-table'
|
452
|
+
|
452
453
|
if !verbose
|
453
454
|
<<-OUTPUT
|
454
455
|
Total warnings: #{all_warnings.length}
|
data/lib/brakeman/scanner.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
1
|
begin
|
4
|
-
|
2
|
+
Brakeman.load_brakeman_dependency 'ruby_parser'
|
5
3
|
require 'ruby_parser/bm_sexp.rb'
|
6
4
|
require 'ruby_parser/bm_sexp_processor.rb'
|
7
5
|
require 'brakeman/processor'
|
@@ -24,7 +22,7 @@ class Brakeman::Scanner
|
|
24
22
|
@options = options
|
25
23
|
@app_tree = Brakeman::AppTree.from_options(options)
|
26
24
|
|
27
|
-
if !@app_tree.root || !@app_tree.exists?("app")
|
25
|
+
if (!@app_tree.root || !@app_tree.exists?("app")) && !options[:force_scan]
|
28
26
|
raise Brakeman::NoApplication, "Please supply the path to a Rails application."
|
29
27
|
end
|
30
28
|
|
data/lib/brakeman/tracker.rb
CHANGED
@@ -90,12 +90,7 @@ class Brakeman::Tracker
|
|
90
90
|
set.each do |set_name, collection|
|
91
91
|
collection.each_method do |method_name, definition|
|
92
92
|
src = definition[:src]
|
93
|
-
if src.node_type == :defs
|
94
|
-
method_name = "#{src[1]}.#{method_name}"
|
95
|
-
end
|
96
|
-
|
97
93
|
yield src, set_name, method_name, definition[:file]
|
98
|
-
|
99
94
|
end
|
100
95
|
end
|
101
96
|
end
|
@@ -254,10 +249,6 @@ class Brakeman::Tracker
|
|
254
249
|
set.each do |set_name, info|
|
255
250
|
info.each_method do |method_name, definition|
|
256
251
|
src = definition[:src]
|
257
|
-
if src.node_type == :defs
|
258
|
-
method_name = "#{src[1]}.#{method_name}"
|
259
|
-
end
|
260
|
-
|
261
252
|
finder.process_source src, :class => set_name, :method => method_name, :file => definition[:file]
|
262
253
|
end
|
263
254
|
end
|
data/lib/brakeman/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman-min
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Collins
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- brakeman-public_cert.pem
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-06-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|
@@ -184,6 +184,7 @@ files:
|
|
184
184
|
- lib/brakeman/processors/lib/render_helper.rb
|
185
185
|
- lib/brakeman/processors/lib/render_path.rb
|
186
186
|
- lib/brakeman/processors/lib/route_helper.rb
|
187
|
+
- lib/brakeman/processors/lib/safe_call_helper.rb
|
187
188
|
- lib/brakeman/processors/library_processor.rb
|
188
189
|
- lib/brakeman/processors/model_processor.rb
|
189
190
|
- lib/brakeman/processors/output_processor.rb
|