brakeman 1.5.1 → 1.5.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.
- data/bin/brakeman +10 -8
- data/lib/brakeman/checks/base_check.rb +12 -0
- data/lib/brakeman/checks/check_link_to.rb +18 -6
- data/lib/brakeman/checks/check_render.rb +28 -14
- data/lib/brakeman/checks/check_sql.rb +1 -1
- data/lib/brakeman/options.rb +1 -1
- data/lib/brakeman/processors/erubis_template_processor.rb +9 -3
- data/lib/brakeman/rescanner.rb +1 -1
- data/lib/brakeman/scanner.rb +8 -3
- data/lib/brakeman/version.rb +1 -1
- data/lib/ruby_parser/bm_sexp.rb +112 -0
- data/lib/ruby_parser/ruby_parser_extras.rb +1 -107
- metadata +116 -72
data/bin/brakeman
CHANGED
@@ -6,14 +6,6 @@ require 'brakeman'
|
|
6
6
|
require 'brakeman/options'
|
7
7
|
require 'brakeman/version'
|
8
8
|
|
9
|
-
trap("INT") do
|
10
|
-
$stderr.puts "\nInterrupted - exiting."
|
11
|
-
if RUBY_VERSION.include? "1.9"
|
12
|
-
$stderr.puts Thread.current.backtrace
|
13
|
-
end
|
14
|
-
exit!
|
15
|
-
end
|
16
|
-
|
17
9
|
#Parse options
|
18
10
|
options, parser = Brakeman::Options.parse! ARGV
|
19
11
|
|
@@ -44,6 +36,16 @@ unless options[:app_path]
|
|
44
36
|
end
|
45
37
|
end
|
46
38
|
|
39
|
+
trap("INT") do
|
40
|
+
$stderr.puts "\nInterrupted - exiting."
|
41
|
+
|
42
|
+
if options[:debug]
|
43
|
+
$stderr.puts caller
|
44
|
+
end
|
45
|
+
|
46
|
+
exit!
|
47
|
+
end
|
48
|
+
|
47
49
|
#Run scan and output a report
|
48
50
|
tracker = Brakeman.run options.merge(:print_report => true, :quiet => options[:quiet])
|
49
51
|
|
@@ -78,6 +78,18 @@ class Brakeman::BaseCheck < SexpProcessor
|
|
78
78
|
exp
|
79
79
|
end
|
80
80
|
|
81
|
+
def process_if exp
|
82
|
+
#This is to ignore user input in condition
|
83
|
+
current_user_input = @has_user_input
|
84
|
+
process exp[1]
|
85
|
+
@has_user_input = current_user_input
|
86
|
+
|
87
|
+
process exp[2] if sexp? exp[2]
|
88
|
+
process exp[3] if sexp? exp[3]
|
89
|
+
|
90
|
+
exp
|
91
|
+
end
|
92
|
+
|
81
93
|
#Note that params are included in current expression
|
82
94
|
def process_params exp
|
83
95
|
@has_user_input = :params
|
@@ -42,13 +42,25 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
|
|
42
42
|
|
43
43
|
@matched = false
|
44
44
|
|
45
|
-
|
45
|
+
#Skip if no arguments(?) or first argument is a hash
|
46
|
+
return if call[3][1].nil? or hash? call[3][1]
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
first_arg = process call[3][1]
|
48
|
+
if version_between? "2.0.0", "2.2.99"
|
49
|
+
check_argument result, call[3][1]
|
50
50
|
|
51
|
-
|
51
|
+
if call[3][2] and not hash? call[3][2]
|
52
|
+
check_argument result, call[3][2]
|
53
|
+
end
|
54
|
+
elsif call[3][2]
|
55
|
+
#Only check first argument if there is a second argument
|
56
|
+
#in Rails 2.3.x
|
57
|
+
check_argument result, call[3][1]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_argument result, exp
|
62
|
+
arg = process exp
|
63
|
+
type, match = has_immediate_user_input? arg
|
52
64
|
|
53
65
|
if type
|
54
66
|
case type
|
@@ -65,7 +77,7 @@ class Brakeman::CheckLinkTo < Brakeman::CheckCrossSiteScripting
|
|
65
77
|
:warning_type => "Cross Site Scripting",
|
66
78
|
:message => message,
|
67
79
|
:confidence => CONFIDENCE[:high]
|
68
|
-
elsif not tracker.options[:ignore_model_output] and match = has_immediate_model?(
|
80
|
+
elsif not tracker.options[:ignore_model_output] and match = has_immediate_model?(arg)
|
69
81
|
method = match[2]
|
70
82
|
|
71
83
|
unless IGNORE_MODEL_METHODS.include? method
|
@@ -29,30 +29,44 @@ class Brakeman::CheckRender < Brakeman::BaseCheck
|
|
29
29
|
def check_for_dynamic_path result
|
30
30
|
view = result[:call][2]
|
31
31
|
|
32
|
-
if sexp? view and
|
33
|
-
|
32
|
+
if sexp? view and not duplicate? result
|
34
33
|
add_result result
|
35
34
|
|
36
|
-
|
35
|
+
type, match = has_immediate_user_input? view
|
36
|
+
|
37
|
+
if type
|
37
38
|
confidence = CONFIDENCE[:high]
|
39
|
+
elsif type = include_user_input?(view)
|
40
|
+
if node_type? view, :string_interp, :dstr
|
41
|
+
confidence = CONFIDENCE[:med]
|
42
|
+
else
|
43
|
+
confidence = CONFIDENCE[:low]
|
44
|
+
end
|
38
45
|
else
|
39
|
-
|
46
|
+
return
|
40
47
|
end
|
41
48
|
|
42
|
-
|
43
|
-
:message => "Render path is dynamic",
|
44
|
-
:line => result[:call].line,
|
45
|
-
:code => result[:call],
|
46
|
-
:confidence => confidence }
|
49
|
+
message = "Render path contains "
|
47
50
|
|
48
|
-
|
49
|
-
|
51
|
+
case type
|
52
|
+
when :params
|
53
|
+
message << "parameter value"
|
54
|
+
when :cookies
|
55
|
+
message << "cookie value"
|
56
|
+
when :request
|
57
|
+
message << "request value"
|
58
|
+
when :model
|
59
|
+
#Skip models
|
60
|
+
return
|
50
61
|
else
|
51
|
-
|
52
|
-
warning[:method] = result[:location][2]
|
62
|
+
message << "user input value"
|
53
63
|
end
|
54
64
|
|
55
|
-
|
65
|
+
|
66
|
+
warn :result => result,
|
67
|
+
:warning_type => "Dynamic Render Path",
|
68
|
+
:message => message,
|
69
|
+
:confidence => confidence
|
56
70
|
end
|
57
71
|
end
|
58
72
|
end
|
@@ -201,7 +201,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
|
|
201
201
|
true
|
202
202
|
elsif call? target
|
203
203
|
check_call target
|
204
|
-
elsif target == nil and tracker.options[:rails3] and method.to_s.match
|
204
|
+
elsif target == nil and tracker.options[:rails3] and method.to_s.match(/^first|last|all|where|order|group|having$/)
|
205
205
|
check_arguments args
|
206
206
|
else
|
207
207
|
false
|
data/lib/brakeman/options.rb
CHANGED
@@ -91,7 +91,7 @@ module Brakeman::Options
|
|
91
91
|
|
92
92
|
opts.on "--skip-files file1,file2,etc", Array, "Skip processing of these files" do |files|
|
93
93
|
options[:skip_files] ||= Set.new
|
94
|
-
options[:skip_files].merge files
|
94
|
+
options[:skip_files].merge files
|
95
95
|
end
|
96
96
|
|
97
97
|
opts.on "--skip-libs", "Skip processing lib directory" do
|
@@ -12,16 +12,22 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
12
12
|
method = exp[2]
|
13
13
|
|
14
14
|
#_buf is the default output variable for Erubis
|
15
|
-
if target and (target[1] == :_buf or target[1] ==
|
15
|
+
if target and (target[1] == :_buf or target[1] == :@output_buffer)
|
16
16
|
if method == :<< or method == :safe_concat
|
17
17
|
args = exp[3][1] = process(exp[3][1])
|
18
18
|
|
19
|
-
|
19
|
+
#We want the actual content
|
20
|
+
if args.node_type == :call and (args[2] == :to_s or args[2] == :html_safe!)
|
20
21
|
args = args[1]
|
21
22
|
end
|
22
23
|
|
23
24
|
if args.node_type == :str #ignore plain strings
|
24
25
|
ignore
|
26
|
+
elsif target[1] == :@output_buffer
|
27
|
+
s = Sexp.new :escaped_output, args
|
28
|
+
s.line(exp.line)
|
29
|
+
@current_template[:outputs] << s
|
30
|
+
s
|
25
31
|
else
|
26
32
|
s = Sexp.new :output, args
|
27
33
|
s.line(exp.line)
|
@@ -31,7 +37,7 @@ class Brakeman::ErubisTemplateProcessor < Brakeman::TemplateProcessor
|
|
31
37
|
elsif method == :to_s
|
32
38
|
ignore
|
33
39
|
else
|
34
|
-
abort "Unrecognized action on
|
40
|
+
abort "Unrecognized action on buffer: #{method}"
|
35
41
|
end
|
36
42
|
elsif target == nil and method == :render
|
37
43
|
exp[3] = process exp[3]
|
data/lib/brakeman/rescanner.rb
CHANGED
data/lib/brakeman/scanner.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
begin
|
3
|
-
|
4
|
-
|
3
|
+
if RUBY_VERSION =~ /^1\.9/
|
4
|
+
#Load our own version of ruby_parser :'(
|
5
|
+
require 'ruby_parser/ruby_parser.rb'
|
6
|
+
else
|
7
|
+
require 'ruby_parser'
|
8
|
+
require 'ruby_parser/bm_sexp.rb'
|
9
|
+
end
|
5
10
|
|
6
11
|
require 'haml'
|
7
12
|
require 'sass'
|
@@ -47,7 +52,7 @@ class Brakeman::Scanner
|
|
47
52
|
if RUBY_1_9
|
48
53
|
@ruby_parser = ::Ruby19Parser
|
49
54
|
else
|
50
|
-
@ruby_parser = ::
|
55
|
+
@ruby_parser = ::RubyParser
|
51
56
|
end
|
52
57
|
end
|
53
58
|
|
data/lib/brakeman/version.rb
CHANGED
@@ -0,0 +1,112 @@
|
|
1
|
+
#Sexp changes from ruby_parser
|
2
|
+
#and some changes for caching hash value and tracking 'original' line number
|
3
|
+
#of a Sexp.
|
4
|
+
class Sexp
|
5
|
+
attr_reader :paren
|
6
|
+
|
7
|
+
def paren
|
8
|
+
@paren ||= false
|
9
|
+
end
|
10
|
+
|
11
|
+
def value
|
12
|
+
raise "multi item sexp" if size > 2
|
13
|
+
last
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_sym
|
17
|
+
self.value.to_sym
|
18
|
+
end
|
19
|
+
|
20
|
+
alias :node_type :sexp_type
|
21
|
+
alias :values :sexp_body # TODO: retire
|
22
|
+
|
23
|
+
alias :old_init :initialize
|
24
|
+
alias :old_push :<<
|
25
|
+
alias :old_line :line
|
26
|
+
alias :old_line_set :line=
|
27
|
+
alias :old_file_set :file=
|
28
|
+
alias :old_comments_set :comments=
|
29
|
+
alias :old_compact :compact
|
30
|
+
alias :old_fara :find_and_replace_all
|
31
|
+
alias :old_find_node :find_node
|
32
|
+
|
33
|
+
def initialize *args
|
34
|
+
old_init(*args)
|
35
|
+
@original_line = nil
|
36
|
+
@my_hash_value = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def original_line line = nil
|
40
|
+
if line
|
41
|
+
@my_hash_value = nil
|
42
|
+
@original_line = line
|
43
|
+
else
|
44
|
+
@original_line
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def hash
|
49
|
+
#There still seems to be some instances in which the hash of the
|
50
|
+
#Sexp changes, but I have not found what method call is doing it.
|
51
|
+
#Of course, Sexp is subclasses from Array, so who knows what might
|
52
|
+
#be going on.
|
53
|
+
@my_hash_value ||= super
|
54
|
+
end
|
55
|
+
|
56
|
+
def line *args
|
57
|
+
@my_hash_value = nil
|
58
|
+
old_line(*args)
|
59
|
+
end
|
60
|
+
|
61
|
+
def line= *args
|
62
|
+
@my_hash_value = nil
|
63
|
+
old_line_set(*args)
|
64
|
+
end
|
65
|
+
|
66
|
+
def file= *args
|
67
|
+
@my_hash_value = nil
|
68
|
+
old_file_set(*args)
|
69
|
+
end
|
70
|
+
|
71
|
+
def compact
|
72
|
+
@my_hash_value = nil
|
73
|
+
old_compact
|
74
|
+
end
|
75
|
+
|
76
|
+
def find_and_replace_all *args
|
77
|
+
@my_hash_value = nil
|
78
|
+
old_fara(*args)
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_node *args
|
82
|
+
@my_hash_value = nil
|
83
|
+
old_find_node(*args)
|
84
|
+
end
|
85
|
+
|
86
|
+
def paren= arg
|
87
|
+
@my_hash_value = nil
|
88
|
+
@paren = arg
|
89
|
+
end
|
90
|
+
|
91
|
+
def comments= *args
|
92
|
+
@my_hash_value = nil
|
93
|
+
old_comments_set(*args)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#Invalidate hash cache if the Sexp changes
|
98
|
+
[:[]=, :clear, :collect!, :compact!, :concat, :delete, :delete_at,
|
99
|
+
:delete_if, :drop, :drop_while, :fill, :flatten!, :replace, :insert,
|
100
|
+
:keep_if, :map!, :pop, :push, :reject!, :replace, :reverse!, :rotate!,
|
101
|
+
:select!, :shift, :shuffle!, :slice!, :sort!, :sort_by!, :transpose,
|
102
|
+
:uniq!, :unshift].each do |method|
|
103
|
+
|
104
|
+
Sexp.class_eval <<-RUBY
|
105
|
+
def #{method} *args
|
106
|
+
@my_hash_value = nil
|
107
|
+
super
|
108
|
+
end
|
109
|
+
RUBY
|
110
|
+
end
|
111
|
+
|
112
|
+
|
@@ -1051,113 +1051,7 @@ class Symbol
|
|
1051
1051
|
end
|
1052
1052
|
end
|
1053
1053
|
|
1054
|
-
|
1055
|
-
attr_reader :paren
|
1056
|
-
|
1057
|
-
def paren
|
1058
|
-
@paren ||= false
|
1059
|
-
end
|
1060
|
-
|
1061
|
-
def value
|
1062
|
-
raise "multi item sexp" if size > 2
|
1063
|
-
last
|
1064
|
-
end
|
1065
|
-
|
1066
|
-
def to_sym
|
1067
|
-
self.value.to_sym
|
1068
|
-
end
|
1069
|
-
|
1070
|
-
alias :node_type :sexp_type
|
1071
|
-
alias :values :sexp_body # TODO: retire
|
1072
|
-
|
1073
|
-
alias :old_init :initialize
|
1074
|
-
alias :old_push :<<
|
1075
|
-
alias :old_line :line
|
1076
|
-
alias :old_line_set :line=
|
1077
|
-
alias :old_file_set :file=
|
1078
|
-
alias :old_comments_set :comments=
|
1079
|
-
alias :old_compact :compact
|
1080
|
-
alias :old_fara :find_and_replace_all
|
1081
|
-
alias :old_find_node :find_node
|
1082
|
-
|
1083
|
-
def initialize *args
|
1084
|
-
old_init *args
|
1085
|
-
@original_line = nil
|
1086
|
-
@my_hash_value = nil
|
1087
|
-
end
|
1088
|
-
|
1089
|
-
def original_line line = nil
|
1090
|
-
if line
|
1091
|
-
@my_hash_value = nil
|
1092
|
-
@original_line = line
|
1093
|
-
else
|
1094
|
-
@original_line
|
1095
|
-
end
|
1096
|
-
end
|
1097
|
-
|
1098
|
-
def hash
|
1099
|
-
#There still seems to be some instances in which the hash of the
|
1100
|
-
#Sexp changes, but I have not found what method call is doing it.
|
1101
|
-
#Of course, Sexp is subclasses from Array, so who knows what might
|
1102
|
-
#be going on.
|
1103
|
-
@my_hash_value ||= super
|
1104
|
-
end
|
1105
|
-
|
1106
|
-
def line *args
|
1107
|
-
@my_hash_value = nil
|
1108
|
-
old_line *args
|
1109
|
-
end
|
1110
|
-
|
1111
|
-
def line= *args
|
1112
|
-
@my_hash_value = nil
|
1113
|
-
old_line_set *args
|
1114
|
-
end
|
1115
|
-
|
1116
|
-
def file= *args
|
1117
|
-
@my_hash_value = nil
|
1118
|
-
old_file_set *args
|
1119
|
-
end
|
1120
|
-
|
1121
|
-
def compact
|
1122
|
-
@my_hash_value = nil
|
1123
|
-
old_compact
|
1124
|
-
end
|
1125
|
-
|
1126
|
-
def find_and_replace_all *args
|
1127
|
-
@my_hash_value = nil
|
1128
|
-
old_fara *args
|
1129
|
-
end
|
1130
|
-
|
1131
|
-
def find_node *args
|
1132
|
-
@my_hash_value = nil
|
1133
|
-
old_find_node *args
|
1134
|
-
end
|
1135
|
-
|
1136
|
-
def paren= arg
|
1137
|
-
@my_hash_value = nil
|
1138
|
-
@paren = arg
|
1139
|
-
end
|
1140
|
-
|
1141
|
-
def comments= *args
|
1142
|
-
@my_hash_value = nil
|
1143
|
-
old_comments_set *args
|
1144
|
-
end
|
1145
|
-
end
|
1146
|
-
|
1147
|
-
#Invalidate hash cache if the Sexp changes
|
1148
|
-
[:[]=, :clear, :collect!, :compact!, :concat, :delete, :delete_at,
|
1149
|
-
:delete_if, :drop, :drop_while, :fill, :flatten!, :replace, :insert,
|
1150
|
-
:keep_if, :map!, :pop, :push, :reject!, :replace, :reverse!, :rotate!,
|
1151
|
-
:select!, :shift, :shuffle!, :slice!, :sort!, :sort_by!, :transpose,
|
1152
|
-
:uniq!, :unshift].each do |method|
|
1153
|
-
|
1154
|
-
Sexp.class_eval <<-RUBY
|
1155
|
-
def #{method} *args
|
1156
|
-
@my_hash_value = nil
|
1157
|
-
super
|
1158
|
-
end
|
1159
|
-
RUBY
|
1160
|
-
end
|
1054
|
+
require 'bm_sexp'
|
1161
1055
|
|
1162
1056
|
# END HACK
|
1163
1057
|
############################################################
|
metadata
CHANGED
@@ -1,107 +1,141 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: brakeman
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 5
|
9
|
+
- 2
|
10
|
+
version: 1.5.2
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Justin Collins
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2012-03-22 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: activesupport
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
22
32
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
26
35
|
name: i18n
|
27
|
-
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
38
|
none: false
|
29
|
-
requirements:
|
30
|
-
- -
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
33
46
|
type: :runtime
|
34
|
-
|
35
|
-
|
36
|
-
- !ruby/object:Gem::Dependency
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
37
49
|
name: ruby2ruby
|
38
|
-
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
39
52
|
none: false
|
40
|
-
requirements:
|
53
|
+
requirements:
|
41
54
|
- - ~>
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 11
|
57
|
+
segments:
|
58
|
+
- 1
|
59
|
+
- 2
|
60
|
+
version: "1.2"
|
44
61
|
type: :runtime
|
45
|
-
|
46
|
-
|
47
|
-
- !ruby/object:Gem::Dependency
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
48
64
|
name: ruport
|
49
|
-
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
67
|
none: false
|
51
|
-
requirements:
|
68
|
+
requirements:
|
52
69
|
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 1
|
74
|
+
- 6
|
75
|
+
version: "1.6"
|
55
76
|
type: :runtime
|
56
|
-
|
57
|
-
|
58
|
-
- !ruby/object:Gem::Dependency
|
77
|
+
version_requirements: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
59
79
|
name: erubis
|
60
|
-
|
80
|
+
prerelease: false
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
61
82
|
none: false
|
62
|
-
requirements:
|
83
|
+
requirements:
|
63
84
|
- - ~>
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 15
|
87
|
+
segments:
|
88
|
+
- 2
|
89
|
+
- 6
|
90
|
+
version: "2.6"
|
66
91
|
type: :runtime
|
67
|
-
|
68
|
-
|
69
|
-
- !ruby/object:Gem::Dependency
|
92
|
+
version_requirements: *id005
|
93
|
+
- !ruby/object:Gem::Dependency
|
70
94
|
name: haml
|
71
|
-
|
95
|
+
prerelease: false
|
96
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
|
-
requirements:
|
98
|
+
requirements:
|
74
99
|
- - ~>
|
75
|
-
- !ruby/object:Gem::Version
|
76
|
-
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 7
|
102
|
+
segments:
|
103
|
+
- 3
|
104
|
+
- 0
|
105
|
+
version: "3.0"
|
77
106
|
type: :runtime
|
78
|
-
|
79
|
-
|
80
|
-
- !ruby/object:Gem::Dependency
|
107
|
+
version_requirements: *id006
|
108
|
+
- !ruby/object:Gem::Dependency
|
81
109
|
name: sass
|
82
|
-
|
110
|
+
prerelease: false
|
111
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
83
112
|
none: false
|
84
|
-
requirements:
|
113
|
+
requirements:
|
85
114
|
- - ~>
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
hash: 7
|
117
|
+
segments:
|
118
|
+
- 3
|
119
|
+
- 0
|
120
|
+
version: "3.0"
|
88
121
|
type: :runtime
|
89
|
-
|
90
|
-
|
91
|
-
description: Brakeman detects security vulnerabilities in Ruby on Rails applications
|
92
|
-
via static analysis.
|
122
|
+
version_requirements: *id007
|
123
|
+
description: Brakeman detects security vulnerabilities in Ruby on Rails applications via static analysis.
|
93
124
|
email:
|
94
|
-
executables:
|
125
|
+
executables:
|
95
126
|
- brakeman
|
96
127
|
extensions: []
|
128
|
+
|
97
129
|
extra_rdoc_files: []
|
98
|
-
|
130
|
+
|
131
|
+
files:
|
99
132
|
- bin/brakeman
|
100
133
|
- WARNING_TYPES
|
101
134
|
- FEATURES
|
102
135
|
- README.md
|
103
136
|
- lib/ruby_parser/ruby18_parser.rb
|
104
137
|
- lib/ruby_parser/ruby_parser_extras.rb
|
138
|
+
- lib/ruby_parser/bm_sexp.rb
|
105
139
|
- lib/ruby_parser/ruby_lexer.rb
|
106
140
|
- lib/ruby_parser/ruby_parser.rb
|
107
141
|
- lib/ruby_parser/ruby19_parser.rb
|
@@ -175,26 +209,36 @@ files:
|
|
175
209
|
- lib/brakeman/format/style.css
|
176
210
|
homepage: http://brakemanscanner.org
|
177
211
|
licenses: []
|
212
|
+
|
178
213
|
post_install_message:
|
179
214
|
rdoc_options: []
|
180
|
-
|
215
|
+
|
216
|
+
require_paths:
|
181
217
|
- lib
|
182
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
218
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
183
219
|
none: false
|
184
|
-
requirements:
|
185
|
-
- -
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
|
188
|
-
|
220
|
+
requirements:
|
221
|
+
- - ">="
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
hash: 3
|
224
|
+
segments:
|
225
|
+
- 0
|
226
|
+
version: "0"
|
227
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
228
|
none: false
|
190
|
-
requirements:
|
191
|
-
- -
|
192
|
-
- !ruby/object:Gem::Version
|
193
|
-
|
229
|
+
requirements:
|
230
|
+
- - ">="
|
231
|
+
- !ruby/object:Gem::Version
|
232
|
+
hash: 3
|
233
|
+
segments:
|
234
|
+
- 0
|
235
|
+
version: "0"
|
194
236
|
requirements: []
|
237
|
+
|
195
238
|
rubyforge_project:
|
196
239
|
rubygems_version: 1.8.15
|
197
240
|
signing_key:
|
198
241
|
specification_version: 3
|
199
242
|
summary: Security vulnerability scanner for Ruby on Rails.
|
200
243
|
test_files: []
|
244
|
+
|