brakeman-lib 5.4.0 → 5.4.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
2
  SHA256:
3
- metadata.gz: c63376837c6212df7e6f9ec337cc1091bcb726799b2437293cd6a32cbc59362a
4
- data.tar.gz: 5c3023810d965759ce42f96ce1af3a5de5dd891b907f7d50c8ce1c1aa0e058ca
3
+ metadata.gz: 1bd15d1d3f41a0fe1f537728a63f5fe432eae4d4b82cdb07233007e794b4b19a
4
+ data.tar.gz: 8fd1c274006689e0e391c5586c9bd59c7ce776a998c9313561185216e51f9519
5
5
  SHA512:
6
- metadata.gz: f7e7972da6fb0625832a35c8faf224df3de41dab66a1986110f671c21b5609262697656045e67ca418665aa9d5638ff8ff42a293e01f16406b54de718ce38da5
7
- data.tar.gz: f43ea6ec1fb403926d3e5c021f94a18babb611bc53c3ad073e9af25ac40c49aeeefd630460f43fb8c45d08be18754a2d0270fad8e70fda2d0089674e29f6ec7c
6
+ metadata.gz: d3c99025931ba8a59c7852132cb80100f3f720de1ebfe632899e499a5784d5e92534efc6d9a04729bf3aec0d07c90fc2f69efccfd3d49558c277e370ae3d58f3
7
+ data.tar.gz: 571f89f8d5eb19b1d2c472517e3d66d819ab715379fd6b5bdd15cd136560499d8d86ff79da19a86a2c03830b8e0b0d0bf0dec3935267f75eacc95396a71d1f81
data/CHANGES.md CHANGED
@@ -1,3 +1,15 @@
1
+ # 5.4.1 - 2023-02-21
2
+
3
+ * Fix file/line location for EOL software warnings
4
+ * Revise checking for request.env to only consider request headers
5
+ * Add `redirect_back` and `redirect_back_or_to` to open redirect check
6
+ * Support Rails 7 redirect options
7
+ * Add Rails 6.1 and 7.0 default configuration values
8
+ * Prevent redirects using `url_from` being marked as unsafe (Lachlan Sylvester)
9
+ * Warn about unscoped find for `find_by(id: ...)`
10
+ * Support `presence`, `presence_in` and `in?`
11
+ * Fix issue with `if` expressions in `when` clauses
12
+
1
13
  # 5.4.0 - 2022-11-17
2
14
 
3
15
  * Use relative paths for CodeClimate report format (Mike Poage)
data/README.md CHANGED
@@ -64,9 +64,9 @@ Outside of Rails root (note that the output file is relative to path/to/rails/ap
64
64
 
65
65
  # Compatibility
66
66
 
67
- Brakeman should work with any version of Rails from 2.3.x to 6.x.
67
+ Brakeman should work with any version of Rails from 2.3.x to 7.x.
68
68
 
69
- Brakeman can analyze code written with Ruby 1.8 syntax and newer, but requires at least Ruby 2.4.0 to run.
69
+ Brakeman can analyze code written with Ruby 1.8 syntax and newer, but requires at least Ruby 2.5.0 to run.
70
70
 
71
71
  # Basic Options
72
72
 
@@ -76,7 +76,7 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
76
76
  @has_user_input = Match.new(:params, exp)
77
77
  elsif cookies? target
78
78
  @has_user_input = Match.new(:cookies, exp)
79
- elsif request_env? target
79
+ elsif request_headers? target
80
80
  @has_user_input = Match.new(:request, exp)
81
81
  elsif sexp? target and model_name? target[1] #TODO: Can this be target.target?
82
82
  @has_user_input = Match.new(:model, exp)
@@ -313,7 +313,7 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
313
313
  return Match.new(:params, exp)
314
314
  elsif cookies? exp
315
315
  return Match.new(:cookies, exp)
316
- elsif request_env? exp
316
+ elsif request_headers? exp
317
317
  return Match.new(:request, exp)
318
318
  else
319
319
  has_immediate_user_input? exp.target
@@ -467,7 +467,6 @@ class Brakeman::BaseCheck < Brakeman::SexpProcessor
467
467
  version_between? version, "2.3.18.99", tracker.config.gem_version(:'railslts-version')
468
468
  end
469
469
 
470
-
471
470
  def version_between? low_version, high_version, current_version = nil
472
471
  tracker.config.version_between? low_version, high_version, current_version
473
472
  end
@@ -11,8 +11,6 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
11
11
  @description = "Looks for calls to redirect_to with user input as arguments"
12
12
 
13
13
  def run_check
14
- Brakeman.debug "Finding calls to redirect_to()"
15
-
16
14
  @model_find_calls = Set[:all, :create, :create!, :find, :find_by_sql, :first, :first!, :last, :last!, :new, :sole]
17
15
 
18
16
  if tracker.options[:rails3]
@@ -27,7 +25,9 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
27
25
  @model_find_calls << :find_sole_by
28
26
  end
29
27
 
30
- @tracker.find_call(:target => false, :method => :redirect_to).each do |res|
28
+ methods = [:redirect_to, :redirect_back, :redirect_back_or_to]
29
+
30
+ @tracker.find_call(:target => false, :methods => methods).each do |res|
31
31
  process_result res
32
32
  end
33
33
  end
@@ -36,18 +36,28 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
36
36
  return unless original? result
37
37
 
38
38
  call = result[:call]
39
- method = call.method
40
-
41
39
  opt = call.first_arg
42
40
 
43
- if method == :redirect_to and
41
+ # Location is specified with `fallback_location:`
42
+ # otherwise the arguments do not contain a location and
43
+ # the call can be ignored
44
+ if call.method == :redirect_back
45
+ if hash? opt and location = hash_access(opt, :fallback_location)
46
+ opt = location
47
+ else
48
+ return
49
+ end
50
+ end
51
+
52
+ if not protected_by_raise?(call) and
44
53
  not only_path?(call) and
45
54
  not explicit_host?(opt) and
46
55
  not slice_call?(opt) and
47
56
  not safe_permit?(opt) and
48
- res = include_user_input?(call)
57
+ not disallow_other_host?(call) and
58
+ res = include_user_input?(opt)
49
59
 
50
- if res.type == :immediate
60
+ if res.type == :immediate and not allow_other_host?(call)
51
61
  confidence = :high
52
62
  else
53
63
  confidence = :weak
@@ -68,42 +78,42 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
68
78
  #is being output directly. This is necessary because of tracker.options[:check_arguments]
69
79
  #which can be used to enable/disable reporting output of method calls which use
70
80
  #user input as arguments.
71
- def include_user_input? call, immediate = :immediate
81
+ def include_user_input? opt, immediate = :immediate
72
82
  Brakeman.debug "Checking if call includes user input"
73
83
 
74
- arg = call.first_arg
75
-
76
84
  # if the first argument is an array, rails assumes you are building a
77
85
  # polymorphic route, which will never jump off-host
78
- return false if array? arg
86
+ return false if array? opt
79
87
 
80
88
  if tracker.options[:ignore_redirect_to_model]
81
- if model_instance?(arg) or decorated_model?(arg)
89
+ if model_instance?(opt) or decorated_model?(opt)
82
90
  return false
83
91
  end
84
92
  end
85
93
 
86
- if res = has_immediate_model?(arg)
87
- unless call? arg and arg.method.to_s =~ /_path/
94
+ if res = has_immediate_model?(opt)
95
+ unless call? opt and opt.method.to_s =~ /_path/
88
96
  return Match.new(immediate, res)
89
97
  end
90
- elsif call? arg
91
- if request_value? arg
92
- return Match.new(immediate, arg)
93
- elsif request_value? arg.target
94
- return Match.new(immediate, arg.target)
95
- elsif arg.method == :url_for and include_user_input? arg
96
- return Match.new(immediate, arg)
98
+ elsif call? opt
99
+ if request_value? opt
100
+ return Match.new(immediate, opt)
101
+ elsif opt.method == :url_for and include_user_input? opt.first_arg
102
+ return Match.new(immediate, opt)
97
103
  #Ignore helpers like some_model_url?
98
- elsif arg.method.to_s =~ /_(url|path)\z/
104
+ elsif opt.method.to_s =~ /_(url|path)\z/
105
+ return false
106
+ elsif opt.method == :url_from
99
107
  return false
100
108
  end
101
- elsif request_value? arg
102
- return Match.new(immediate, arg)
109
+ elsif request_value? opt
110
+ return Match.new(immediate, opt)
111
+ elsif node_type? opt, :or
112
+ return (include_user_input?(opt.lhs) or include_user_input?(opt.rhs))
103
113
  end
104
114
 
105
- if tracker.options[:check_arguments] and call? arg
106
- include_user_input? arg, false #I'm doubting if this is really necessary...
115
+ if tracker.options[:check_arguments] and call? opt
116
+ include_user_input? opt.first_arg, false #I'm doubting if this is really necessary...
107
117
  else
108
118
  false
109
119
  end
@@ -208,7 +218,7 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
208
218
  def friendly_model? exp
209
219
  call? exp and model_name? exp.target and exp.method == :friendly
210
220
  end
211
-
221
+
212
222
  #Returns true if exp is (probably) a decorated model instance
213
223
  #using the Draper gem
214
224
  def decorated_model? exp
@@ -249,7 +259,7 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
249
259
  if call? exp and params? exp.target and exp.method == :permit
250
260
  exp.each_arg do |opt|
251
261
  if symbol? opt and DANGEROUS_KEYS.include? opt.value
252
- return false
262
+ return false
253
263
  end
254
264
  end
255
265
 
@@ -258,4 +268,25 @@ class Brakeman::CheckRedirect < Brakeman::BaseCheck
258
268
 
259
269
  false
260
270
  end
271
+
272
+ def protected_by_raise? call
273
+ raise_on_redirects? and
274
+ not allow_other_host? call
275
+ end
276
+
277
+ def raise_on_redirects?
278
+ @raise_on_redirects ||= true?(tracker.config.rails.dig(:action_controller, :raise_on_open_redirects))
279
+ end
280
+
281
+ def allow_other_host? call
282
+ opt = call.last_arg
283
+
284
+ hash? opt and true? hash_access(opt, :allow_other_host)
285
+ end
286
+
287
+ def disallow_other_host? call
288
+ opt = call.last_arg
289
+
290
+ hash? opt and false? hash_access(opt, :allow_other_host)
291
+ end
261
292
  end
@@ -23,6 +23,14 @@ class Brakeman::CheckUnscopedFind < Brakeman::BaseCheck
23
23
  calls.each do |call|
24
24
  process_result call
25
25
  end
26
+
27
+ tracker.find_call(:method => :find_by, :targets => associated_model_names).each do |result|
28
+ arg = result[:call].first_arg
29
+
30
+ if hash? arg and hash_access(arg, :id)
31
+ process_result result
32
+ end
33
+ end
26
34
  end
27
35
 
28
36
  def process_result result
@@ -34,7 +34,7 @@ class Brakeman::EOLCheck < Brakeman::BaseCheck
34
34
  warning_code: :"pending_eol_#{library}",
35
35
  message: msg("Support for ", msg_version(version, library.capitalize), " ends on #{eol_date}"),
36
36
  confidence: confidence,
37
- gem_info: gemfile_or_environment,
37
+ gem_info: gemfile_or_environment(library),
38
38
  :cwe_id => [1104]
39
39
  end
40
40
 
@@ -43,7 +43,7 @@ class Brakeman::EOLCheck < Brakeman::BaseCheck
43
43
  warning_code: :"eol_#{library}",
44
44
  message: msg("Support for ", msg_version(version, library.capitalize), " ended on #{eol_date}"),
45
45
  confidence: :high,
46
- gem_info: gemfile_or_environment,
46
+ gem_info: gemfile_or_environment(library),
47
47
  :cwe_id => [1104]
48
48
  end
49
49
  end
@@ -300,11 +300,7 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
300
300
  if array? target and first_arg.nil? and sexp? target[1]
301
301
  exp = target[1]
302
302
  end
303
- when :freeze
304
- unless target.nil?
305
- exp = target
306
- end
307
- when :dup
303
+ when :freeze, :dup, :presence
308
304
  unless target.nil?
309
305
  exp = target
310
306
  end
@@ -332,6 +328,17 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
332
328
  exp = res
333
329
  end
334
330
  end
331
+ when :presence_in
332
+ arg = exp.first_arg
333
+
334
+ if node_type? arg, :array
335
+ # 1.presence_in [1,2,3]
336
+ if arg.include? target
337
+ exp = target
338
+ elsif all_literals? arg
339
+ exp = safe_literal(exp.line)
340
+ end
341
+ end
335
342
  end
336
343
 
337
344
  exp
@@ -862,6 +869,17 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
862
869
  (all_literals? exp.target or dir_glob? exp.target)
863
870
  end
864
871
 
872
+ # Check if exp is a call to Array#include? on an array literal
873
+ # that contains all literal values. For example:
874
+ #
875
+ # x.in? [1, 2, "a"]
876
+ #
877
+ def in_array_all_literals? exp
878
+ call? exp and
879
+ exp.method == :in? and
880
+ all_literals? exp.first_arg
881
+ end
882
+
865
883
  # Check if exp is a call to Hash#include? on a hash literal
866
884
  # that contains all literal values. For example:
867
885
  #
@@ -915,28 +933,30 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
915
933
  scope do
916
934
  @branch_env = env.current
917
935
  branch_index = 2 + i # s(:if, condition, then_branch, else_branch)
918
- if i == 0 and hash_or_array_include_all_literals? condition
936
+ exp[branch_index] = if i == 0 and hash_or_array_include_all_literals? condition
919
937
  # If the condition is ["a", "b"].include? x
920
- # set x to "a" inside the true branch
938
+ # set x to safe_literal inside the true branch
921
939
  var = condition.first_arg
922
- previous_value = env.current[var]
923
- env.current[var] = safe_literal(var.line)
924
- exp[branch_index] = process_if_branch branch
925
- env.current[var] = previous_value
940
+ value = safe_literal(var.line)
941
+ process_branch_with_value(var, value, branch, i)
942
+ elsif i == 0 and in_array_all_literals? condition
943
+ # If the condition is x.in? ["a", "b"]
944
+ # set x to safe_literal inside the true branch
945
+ var = condition.target
946
+ value = safe_literal(var.line)
947
+ process_branch_with_value(var, value, branch, i)
926
948
  elsif i == 0 and equality_check? condition
927
949
  # For conditions like a == b,
928
950
  # set a to b inside the true branch
929
951
  var = condition.target
930
- previous_value = env.current[var]
931
- env.current[var] = condition.first_arg
932
- exp[branch_index] = process_if_branch branch
933
- env.current[var] = previous_value
952
+ value = condition.first_arg
953
+ process_branch_with_value(var, value, branch, i)
934
954
  elsif i == 1 and hash_or_array_include_all_literals? condition and early_return? branch
935
955
  var = condition.first_arg
936
956
  env.current[var] = safe_literal(var.line)
937
- exp[branch_index] = process_if_branch branch
957
+ process_if_branch branch
938
958
  else
939
- exp[branch_index] = process_if_branch branch
959
+ process_if_branch branch
940
960
  end
941
961
  branch_scopes << env.current
942
962
  @branch_env = nil
@@ -953,6 +973,14 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
953
973
  exp
954
974
  end
955
975
 
976
+ def process_branch_with_value var, value, branch, branch_index
977
+ previous_value = env.current[var]
978
+ env.current[var] = value
979
+ result = process_if_branch branch
980
+ env.current[var] = previous_value
981
+ result
982
+ end
983
+
956
984
  def early_return? exp
957
985
  return true if node_type? exp, :return
958
986
  return true if call? exp and [:fail, :raise].include? exp.method
@@ -1016,11 +1044,14 @@ class Brakeman::AliasProcessor < Brakeman::SexpProcessor
1016
1044
  exp.each_sexp do |e|
1017
1045
  if node_type? e, :when
1018
1046
  scope do
1019
- @branch_env = env.current
1020
-
1021
1047
  # Process the when value for matching
1022
1048
  process_default e[1]
1023
1049
 
1050
+ # Moved here to avoid @branch_env being cleared out
1051
+ # in process_default
1052
+ # Maybe in the future don't set it to nil?
1053
+ @branch_env = env.current
1054
+
1024
1055
  # set value of case var if possible
1025
1056
  if case_value
1026
1057
  if simple_when? e
@@ -56,7 +56,7 @@ class Brakeman::GemProcessor < Brakeman::BasicProcessor
56
56
  elsif exp.method == :ruby
57
57
  version = exp.first_arg
58
58
  if string? version
59
- @tracker.config.set_ruby_version version.value
59
+ @tracker.config.set_ruby_version version.value, @gemfile, exp.line
60
60
  end
61
61
  end
62
62
  elsif @inside_gemspec and exp.method == :add_dependency
@@ -97,7 +97,7 @@ class Brakeman::GemProcessor < Brakeman::BasicProcessor
97
97
  if line =~ @gem_name_version
98
98
  @tracker.config.add_gem $1, $2, file, line_num
99
99
  elsif line =~ @ruby_version
100
- @tracker.config.set_ruby_version $1
100
+ @tracker.config.set_ruby_version $1, file, line_num
101
101
  end
102
102
  end
103
103
  end
@@ -6,7 +6,7 @@ require 'brakeman/differ'
6
6
  class Brakeman::Rescanner < Brakeman::Scanner
7
7
  include Brakeman::Util
8
8
  KNOWN_TEMPLATE_EXTENSIONS = Brakeman::TemplateParser::KNOWN_TEMPLATE_EXTENSIONS
9
- SCAN_ORDER = [:config, :gemfile, :initializer, :lib, :routes, :template,
9
+ SCAN_ORDER = [:gemfile, :config, :initializer, :lib, :routes, :template,
10
10
  :model, :controller]
11
11
 
12
12
  #Create new Rescanner to scan changed files
@@ -332,6 +332,8 @@ class Brakeman::Rescanner < Brakeman::Scanner
332
332
  :routes
333
333
  when /\/config\/.+\.(rb|yml)/
334
334
  :config
335
+ when /\.ruby-version/
336
+ :config
335
337
  when /Gemfile|gems\./
336
338
  :gemfile
337
339
  else
@@ -138,7 +138,7 @@ class Brakeman::Scanner
138
138
 
139
139
  if @app_tree.exists? ".ruby-version"
140
140
  if version = @app_tree.file_path(".ruby-version").read[/(\d\.\d.\d+)/]
141
- tracker.config.set_ruby_version version
141
+ tracker.config.set_ruby_version version, @app_tree.file_path(".ruby-version"), 1
142
142
  end
143
143
  end
144
144
 
@@ -129,8 +129,9 @@ module Brakeman
129
129
  @rails_version
130
130
  end
131
131
 
132
- def set_ruby_version version
132
+ def set_ruby_version version, file, line
133
133
  @ruby_version = extract_version(version)
134
+ add_gem :ruby, @ruby_version, file, line
134
135
  end
135
136
 
136
137
  def extract_version version
@@ -230,6 +231,46 @@ module Brakeman
230
231
  set_rails_config(value: true_value, path: [:active_storage, :replace_on_assign_to_many])
231
232
  set_rails_config(value: true_value, path: [:active_record, :collection_cache_versioning])
232
233
  end
234
+
235
+ if version >= 6.1
236
+ set_rails_config(value: true_value, path: [:action_controller, :urlsafe_csrf_tokens])
237
+ set_rails_config(value: Sexp.new(:lit, :lax), path: [:action_dispatch, :cookies_same_site_protection])
238
+ set_rails_config(value: Sexp.new(:lit, 308), path: [:action_dispatch, :ssl_default_redirect_status])
239
+ set_rails_config(value: false_value, path: [:action_view, :form_with_generates_remote_forms])
240
+ set_rails_config(value: true_value, path: [:action_view, :preload_links_header])
241
+ set_rails_config(value: Sexp.new(:lit, 0.15), path: [:active_job, :retry_jitter])
242
+ set_rails_config(value: true_value, path: [:active_record, :has_many_inversing])
243
+ set_rails_config(value: false_value, path: [:active_record, :legacy_connection_handling])
244
+ set_rails_config(value: true_value, path: [:active_storage, :track_variants])
245
+ end
246
+
247
+ if version >= 7.0
248
+ video_args =
249
+ Sexp.new(:str, "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2")
250
+ hash_class = s(:colon2, s(:colon2, s(:const, :OpenSSL), :Digest), :SHA256)
251
+
252
+ set_rails_config(value: true_value, path: [:action_controller, :raise_on_open_redirects])
253
+ set_rails_config(value: true_value, path: [:action_controller, :wrap_parameters_by_default])
254
+ set_rails_config(value: Sexp.new(:lit, :json), path: [:action_dispatch, :cookies_serializer])
255
+ set_rails_config(value: false_value, path: [:action_dispatch, :return_only_request_media_type_on_content_type])
256
+ set_rails_config(value: Sexp.new(:lit, 5), path: [:action_mailer, :smtp_timeout])
257
+ set_rails_config(value: false_value, path: [:action_view, :apply_stylesheet_media_default])
258
+ set_rails_config(value: true_value, path: [:ction_view, :button_to_generates_button_tag])
259
+ set_rails_config(value: true_value, path: [:active_record, :automatic_scope_inversing])
260
+ set_rails_config(value: false_value, path: [:active_record, :partial_inserts])
261
+ set_rails_config(value: true_value, path: [:active_record, :verify_foreign_keys_for_fixtures])
262
+ set_rails_config(value: true_value, path: [:active_storage, :multiple_file_field_include_hidden])
263
+ set_rails_config(value: Sexp.new(:lit, :vips), path: [:active_storage, :variant_processor])
264
+ set_rails_config(value: video_args, path: [:active_storage, :video_preview_arguments])
265
+ set_rails_config(value: Sexp.new(:lit, 7.0), path: [:active_support, :cache_format_version])
266
+ set_rails_config(value: true_value, path: [:active_support, :disable_to_s_conversion])
267
+ set_rails_config(value: true_value, path: [:active_support, :executor_around_test_case])
268
+ set_rails_config(value: hash_class, path: [:active_support, :hash_digest_class])
269
+ set_rails_config(value: Sexp.new(:lit, :thread), path: [:active_support, :isolation_level])
270
+ set_rails_config(value: hash_class, path: [:active_support, :key_generator_hash_digest_class])
271
+ set_rails_config(value: true_value, path: [:active_support, :remove_deprecated_time_with_zone_name])
272
+ set_rails_config(value: true_value, path: [:active_support, :use_rfc4122_namespaced_uuids])
273
+ end
233
274
  end
234
275
  end
235
276
  end
@@ -371,7 +371,7 @@ class Brakeman::Tracker
371
371
  end
372
372
  end
373
373
 
374
- @models.delete model_name
374
+ @models.delete(model_name)
375
375
  end
376
376
 
377
377
  #Clear information related to model
data/lib/brakeman/util.rb CHANGED
@@ -265,15 +265,31 @@ module Brakeman::Util
265
265
  false
266
266
  end
267
267
 
268
- def request_env? exp
269
- call? exp and (exp == REQUEST_ENV or exp[1] == REQUEST_ENV)
268
+ # Only return true when accessing request headers via request.env[...]
269
+ def request_headers? exp
270
+ return unless sexp? exp
271
+
272
+ if exp[1] == REQUEST_ENV
273
+ if exp.method == :[]
274
+ if string? exp.first_arg
275
+ # Only care about HTTP headers, which are prefixed by 'HTTP_'
276
+ exp.first_arg.value.start_with?('HTTP_'.freeze)
277
+ else
278
+ true # request.env[something]
279
+ end
280
+ else
281
+ false # request.env.something
282
+ end
283
+ else
284
+ false
285
+ end
270
286
  end
271
287
 
272
- #Check if exp is params, cookies, or request_env
288
+ #Check if exp is params, cookies, or request_headers
273
289
  def request_value? exp
274
290
  params? exp or
275
291
  cookies? exp or
276
- request_env? exp
292
+ request_headers? exp
277
293
  end
278
294
 
279
295
  def constant? exp
@@ -1,3 +1,3 @@
1
1
  module Brakeman
2
- Version = "5.4.0"
2
+ Version = "5.4.1"
3
3
  end
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.0
4
+ version: 5.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Collins
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-18 00:00:00.000000000 Z
11
+ date: 2023-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -450,7 +450,7 @@ metadata:
450
450
  mailing_list_uri: https://gitter.im/presidentbeef/brakeman
451
451
  source_code_uri: https://github.com/presidentbeef/brakeman
452
452
  wiki_uri: https://github.com/presidentbeef/brakeman/wiki
453
- post_install_message:
453
+ post_install_message:
454
454
  rdoc_options: []
455
455
  require_paths:
456
456
  - lib
@@ -465,8 +465,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
465
465
  - !ruby/object:Gem::Version
466
466
  version: '0'
467
467
  requirements: []
468
- rubygems_version: 3.1.6
469
- signing_key:
468
+ rubygems_version: 3.3.3
469
+ signing_key:
470
470
  specification_version: 4
471
471
  summary: Security vulnerability scanner for Ruby on Rails.
472
472
  test_files: []