brakeman-lib 3.4.1 → 3.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41a53603e2fa56ad3a6fd895b93db05b1e532503
4
- data.tar.gz: ec97788b6b989dd66c7dcc4698a86ec143a34eeb
3
+ metadata.gz: fee8845f90b3f881eea2126cf21818bc5ec0a01b
4
+ data.tar.gz: 6d04dfa38599476644b42dfd4037f0b033ca3f3f
5
5
  SHA512:
6
- metadata.gz: ec25a806ebdb9aa3ad8842020a12a5b9b1e7c581b9bf4ead664ceeec9b2a00d6c63ffa71ad955e105660b8a39cb4a0db3ddf38a716ce3d7303438a2b5ee78076
7
- data.tar.gz: d55e00d236e989175bace2779b3bf94390ec189542911ed408a73e07146076699d72ad6e2d1e3f560532e8cb43e10391a262a1900c302e8d7c52941d9d6121d3
6
+ metadata.gz: b83dd03f8fb44b7fe43178e65dcb4e0e2e72da8eb1a7e336ec65dc5f7ac1d03fde5f7dd1f32bb1057de1d4f49992b10b21f8a11937cdd2adca18e2ff5e7bc840
7
+ data.tar.gz: a17dee450fdd91d5e4332692c04ac3a4436c53a859682b31bf6c4279694fec921656132f6977cbf1ced8bafe96056cf5881f63699e2475dd2e4ff0c6d1424851
data/CHANGES CHANGED
@@ -1,3 +1,18 @@
1
+ # 3.5.0
2
+
3
+ * Allow `-t None`
4
+ * Fail on invalid checks specified by `-x` or `-t`
5
+ * Avoid warning about all, first, or last after Rails 4.0
6
+ * Avoid warning about models in SQLi
7
+ * Lower confidence of SQLi when maybe not on models
8
+ * Warn about SQLi even potentially on non-models
9
+ * Report check name in JSON and plain reports
10
+ * Treat templates without `.html` as HTML anyway
11
+ * Add `--ensure-latest` option (tamgrosser / Michael Grosser)
12
+ * Add `--no-summary` to hide summaries in HTML/text reports
13
+ * Handle `included` block in concerns
14
+ * Process concerns before controllers
15
+
1
16
  # 3.4.1
2
17
 
3
18
  * Show action help at start of interactive ignore
data/README.md CHANGED
@@ -36,7 +36,9 @@ Outside of Rails root:
36
36
 
37
37
  # Compatibility
38
38
 
39
- Brakeman works with Rails 2.x, 3.x, and 4.x.
39
+ Brakeman should work with any version of Rails from 2.3.x to 5.x.
40
+
41
+ Brakeman can analyze code written with Ruby 1.8 syntax and newer, but requires at least Ruby 1.9.3 to run.
40
42
 
41
43
  # Basic Options
42
44
 
@@ -101,7 +103,7 @@ To create and manage this file, use:
101
103
 
102
104
  # Warning information
103
105
 
104
- See [WARNING\_TYPES](WARNING_TYPES) for more information on the warnings reported by this tool.
106
+ See [warning\_types](docs/warning_types) for more information on the warnings reported by this tool.
105
107
 
106
108
  # Warning context
107
109
 
data/bin/brakeman CHANGED
@@ -57,6 +57,13 @@ if options[:quiet].nil?
57
57
  end
58
58
 
59
59
  begin
60
+ if options[:ensure_latest]
61
+ if error = Brakeman.ensure_latest
62
+ warn error
63
+ exit Brakeman::Not_Latest_Version_Exit_Code
64
+ end
65
+ end
66
+
60
67
  if options[:previous_results_json]
61
68
  require 'json'
62
69
  vulns = Brakeman.compare options.merge(:quiet => options[:quiet])
@@ -84,6 +91,9 @@ begin
84
91
  end
85
92
  end
86
93
  rescue Brakeman::NoApplication => e
87
- $stderr.puts e.message
94
+ warn e.message
88
95
  exit Brakeman::No_App_Found_Exit_Code
96
+ rescue Brakeman::MissingChecksError => e
97
+ warn e.message
98
+ exit Brakeman::Missing_Checks_Exit_Code
89
99
  end
data/lib/brakeman.rb CHANGED
@@ -9,6 +9,12 @@ module Brakeman
9
9
  #Exit code returned when no Rails application is detected
10
10
  No_App_Found_Exit_Code = 4
11
11
 
12
+ #Exit code returned when brakeman was outdated
13
+ Not_Latest_Version_Exit_Code = 5
14
+
15
+ #Exit code returned when user requests non-existent checks
16
+ Missing_Checks_Exit_Code = 6
17
+
12
18
  @debug = false
13
19
  @quiet = false
14
20
  @loaded_dependencies = []
@@ -48,8 +54,7 @@ module Brakeman
48
54
  # * :skip_libs - do not process lib/ directory (default: false)
49
55
  # * :skip_checks - checks not to run (run all if not specified)
50
56
  # * :absolute_paths - show absolute path of each file (default: false)
51
- # * :summary_only - only output summary section of report
52
- # (does not apply to tabs format)
57
+ # * :summary_only - only output summary section of report for plain/table (:summary_only, :no_summary, true)
53
58
  #
54
59
  #Alternatively, just supply a path as a string.
55
60
  def self.run options
@@ -324,6 +329,14 @@ module Brakeman
324
329
  end
325
330
  end
326
331
 
332
+ def self.ensure_latest
333
+ current = Brakeman::Version
334
+ latest = Gem.latest_version_for('brakeman').to_s
335
+ if current != latest
336
+ "Brakeman #{current} is not the latest version #{latest}"
337
+ end
338
+ end
339
+
327
340
  #Run a scan. Generally called from Brakeman.run instead of directly.
328
341
  def self.scan options
329
342
  #Load scanner
@@ -341,6 +354,8 @@ module Brakeman
341
354
  scanner = Scanner.new options
342
355
  tracker = scanner.tracker
343
356
 
357
+ check_for_missing_checks options[:run_checks], options[:skip_checks]
358
+
344
359
  notify "Processing application in #{tracker.app_path}"
345
360
  scanner.process
346
361
 
@@ -506,8 +521,17 @@ module Brakeman
506
521
  end if options[:additional_checks_path]
507
522
  end
508
523
 
524
+ def self.check_for_missing_checks included_checks, excluded_checks
525
+ missing = Brakeman::Checks.missing_checks(included_checks || Set.new, excluded_checks || Set.new)
526
+
527
+ unless missing.empty?
528
+ raise MissingChecksError, "Could not find specified check#{missing.length > 1 ? 's' : ''}: #{missing.to_a.join(', ')}"
529
+ end
530
+ end
531
+
509
532
  class DependencyError < RuntimeError; end
510
533
  class RakeInstallError < RuntimeError; end
511
534
  class NoBrakemanError < RuntimeError; end
512
535
  class NoApplication < RuntimeError; end
536
+ class MissingChecksError < RuntimeError; end
513
537
  end
@@ -89,19 +89,20 @@ module Brakeman
89
89
  end
90
90
 
91
91
  def initializer_paths
92
- @initializer_paths ||= find_paths("config/initializers")
92
+ @initializer_paths ||= prioritize_concerns(find_paths("config/initializers"))
93
93
  end
94
94
 
95
95
  def controller_paths
96
- @controller_paths ||= find_paths("app/**/controllers")
96
+ @controller_paths ||= prioritize_concerns(find_paths("app/**/controllers"))
97
97
  end
98
98
 
99
99
  def model_paths
100
- @model_paths ||= find_paths("app/**/models")
100
+ @model_paths ||= prioritize_concerns(find_paths("app/**/models"))
101
101
  end
102
102
 
103
103
  def template_paths
104
- @template_paths ||= find_paths("app/**/views", "*.{#{VIEW_EXTENSIONS}}")
104
+ @template_paths ||= find_paths("app/**/views", "*.{#{VIEW_EXTENSIONS}}") +
105
+ find_paths("app/**/views", "*.{erb,haml,slim}").reject { |path| File.basename(path).count(".") > 1 }
105
106
  end
106
107
 
107
108
  def layout_exists?(name)
@@ -177,5 +178,9 @@ module Brakeman
177
178
  rel_engines = (rel + [""]).join("/,")
178
179
  @root_search_patrern = "{#{roots}}/{#{rel_engines}}"
179
180
  end
181
+
182
+ def prioritize_concerns paths
183
+ paths.partition { |path| path.include? "concerns" }.flatten
184
+ end
180
185
  end
181
186
  end
@@ -37,6 +37,24 @@ class Brakeman::Checks
37
37
  end
38
38
  end
39
39
 
40
+ def self.missing_checks included_checks, excluded_checks
41
+ included_checks = included_checks.map(&:to_s).to_set
42
+ excluded_checks = excluded_checks.map(&:to_s).to_set
43
+
44
+ if included_checks == Set['CheckNone']
45
+ return []
46
+ else
47
+ loaded = self.checks.map { |name| name.to_s.gsub('Brakeman::', '') }.to_set
48
+ missing = (included_checks - loaded) + (excluded_checks - loaded)
49
+
50
+ unless missing.empty?
51
+ return missing
52
+ end
53
+ end
54
+
55
+ []
56
+ end
57
+
40
58
  #No need to use this directly.
41
59
  def initialize options = { }
42
60
  if options[:min_confidence]
@@ -14,11 +14,21 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
14
14
  @description = "Check for SQL injection"
15
15
 
16
16
  def run_check
17
- @sql_targets = [:all, :average, :calculate, :count, :count_by_sql, :exists?, :delete_all, :destroy_all,
18
- :find, :find_by_sql, :first, :last, :maximum, :minimum, :pluck, :sum, :update_all]
19
- @sql_targets.concat [:from, :group, :having, :joins, :lock, :order, :reorder, :select, :where] if tracker.options[:rails3]
17
+ narrow_targets = [:exists?, :select]
18
+
19
+ @sql_targets = [:average, :calculate, :count, :count_by_sql, :delete_all, :destroy_all,
20
+ :find_by_sql, :maximum, :minimum, :pluck, :sum, :update_all]
21
+ @sql_targets.concat [:from, :group, :having, :joins, :lock, :order, :reorder, :where] if tracker.options[:rails3]
20
22
  @sql_targets << :find_by << :find_by! if tracker.options[:rails4]
21
23
 
24
+ if version_between?("2.0.0", "3.9.9") or tracker.config.rails_version.nil?
25
+ @sql_targets << :first << :last << :all
26
+ end
27
+
28
+ if version_between?("2.0.0", "4.0.99") or tracker.config.rails_version.nil?
29
+ @sql_targets << :find
30
+ end
31
+
22
32
  @connection_calls = [:delete, :execute, :insert, :select_all, :select_one,
23
33
  :select_rows, :select_value, :select_values]
24
34
 
@@ -28,10 +38,12 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
28
38
  @connection_calls.concat [:add_limit!, :add_offset_limit!, :add_lock!]
29
39
  end
30
40
 
41
+ @expected_targets = active_record_models.keys + [:connection, :"ActiveRecord::Base"]
42
+
31
43
  Brakeman.debug "Finding possible SQL calls on models"
32
- calls = tracker.find_call :targets => active_record_models.keys,
33
- :methods => @sql_targets,
34
- :chained => true
44
+ calls = tracker.find_call(:methods => @sql_targets, :nested => true)
45
+
46
+ calls.concat tracker.find_call(:targets => active_record_models.keys, :methods => narrow_targets, :chained => true)
35
47
 
36
48
  Brakeman.debug "Finding possible SQL calls with no target"
37
49
  calls.concat tracker.find_call(:target => nil, :methods => @sql_targets)
@@ -39,8 +51,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
39
51
  Brakeman.debug "Finding possible SQL calls using constantized()"
40
52
  calls.concat tracker.find_call(:methods => @sql_targets).select { |result| constantize_call? result }
41
53
 
42
- connect_targets = active_record_models.keys + [:connection, :"ActiveRecord::Base"]
43
- calls.concat tracker.find_call(:targets => connect_targets, :methods => @connection_calls, :chained => true).select { |result| connect_call? result }
54
+ calls.concat tracker.find_call(:targets => @expected_targets, :methods => @connection_calls, :chained => true).select { |result| connect_call? result }
44
55
 
45
56
  Brakeman.debug "Finding calls to named_scope or scope"
46
57
  calls.concat find_scope_calls
@@ -203,6 +214,17 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
203
214
  user_input = dangerous_value
204
215
  end
205
216
 
217
+ if result[:call].target and result[:chain] and not @expected_targets.include? result[:chain].first
218
+ confidence = case confidence
219
+ when CONFIDENCE[:high]
220
+ CONFIDENCE[:med]
221
+ when CONFIDENCE[:med]
222
+ CONFIDENCE[:low]
223
+ else
224
+ confidence
225
+ end
226
+ end
227
+
206
228
  warn :result => result,
207
229
  :warning_type => "SQL Injection",
208
230
  :warning_code => :sql_injection,
@@ -429,7 +451,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
429
451
  unsafe_sql? exp.then_clause or unsafe_sql? exp.else_clause
430
452
  when :call
431
453
  unless IGNORE_METHODS_IN_SQL.include? exp.method
432
- if has_immediate_user_input? exp or has_immediate_model? exp
454
+ if has_immediate_user_input? exp
433
455
  exp
434
456
  elsif exp.method == :to_s
435
457
  find_dangerous_value exp.target, ignore_hash
@@ -446,7 +468,7 @@ class Brakeman::CheckSQL < Brakeman::BaseCheck
446
468
  when :block, :rlist
447
469
  unsafe_sql? exp.last
448
470
  else
449
- if has_immediate_user_input? exp or has_immediate_model? exp
471
+ if has_immediate_user_input? exp
450
472
  exp
451
473
  else
452
474
  nil
@@ -43,6 +43,10 @@ module Brakeman::Options
43
43
  options[:exit_on_warn] = exit_on_warn
44
44
  end
45
45
 
46
+ opts.on "--ensure-latest", "Fail when Brakeman is outdated" do
47
+ options[:ensure_latest] = true
48
+ end
49
+
46
50
  opts.on "-3", "--rails3", "Force Rails 3 mode" do
47
51
  options[:rails3] = true
48
52
  end
@@ -229,8 +233,12 @@ module Brakeman::Options
229
233
  options[:collapse_mass_assignment] = !separate
230
234
  end
231
235
 
232
- opts.on "--summary", "Only output summary of warnings" do
233
- options[:summary_only] = true
236
+ opts.on "--[no-]summary", "Only output summary of warnings" do |summary_only|
237
+ if summary_only
238
+ options[:summary_only] = :summary_only
239
+ else
240
+ options[:summary_only] = :no_summary
241
+ end
234
242
  end
235
243
 
236
244
  opts.on "--absolute-paths", "Output absolute file paths in reports" do
@@ -249,7 +257,7 @@ module Brakeman::Options
249
257
  options[:min_confidence] = 3 - level.to_i
250
258
  end
251
259
 
252
- opts.on "--compare FILE", "Compare the results of a previous brakeman scan (only JSON is supported)" do |file|
260
+ opts.on "--compare FILE", "Compare the results of a previous Brakeman scan (only JSON is supported)" do |file|
253
261
  options[:previous_results_json] = File.expand_path(file)
254
262
  end
255
263
 
@@ -61,6 +61,16 @@ class Brakeman::ControllerProcessor < Brakeman::BaseProcessor
61
61
  handle_module exp, Brakeman::Controller, parent
62
62
  end
63
63
 
64
+ def process_concern concern_name
65
+ return unless @current_class
66
+
67
+ if mod = @tracker.find_class(concern_name)
68
+ if mod.options[:included]
69
+ process mod.options[:included].deep_clone
70
+ end
71
+ end
72
+ end
73
+
64
74
  #Look for specific calls inside the controller
65
75
  def process_call exp
66
76
  return exp if process_call_defn? exp
@@ -89,7 +99,11 @@ class Brakeman::ControllerProcessor < Brakeman::BaseProcessor
89
99
  else
90
100
  case method
91
101
  when :include
92
- @current_class.add_include class_name(first_arg) if @current_class
102
+ if @current_class
103
+ concern = class_name(first_arg)
104
+ @current_class.add_include concern
105
+ process_concern concern
106
+ end
93
107
  when :before_filter, :append_before_filter, :before_action, :append_before_action
94
108
  if node_type? exp.first_arg, :iter
95
109
  add_lambda_filter exp
@@ -51,4 +51,16 @@ class Brakeman::LibraryProcessor < Brakeman::BaseProcessor
51
51
  process_default exp
52
52
  end
53
53
  end
54
+
55
+ def process_iter exp
56
+ res = process_default exp
57
+
58
+ if node_type? res, :iter and call? exp.block_call # sometimes this changes after processing
59
+ if exp.block_call.method == :included
60
+ (@current_module || @current_class).options[:included] = res.block
61
+ end
62
+ end
63
+
64
+ res
65
+ end
54
66
  end
@@ -7,13 +7,20 @@ class Brakeman::Report::Table < Brakeman::Report::Base
7
7
  end
8
8
 
9
9
  def generate_report
10
- out = text_header <<
11
- "\n\n+SUMMARY+\n\n" <<
12
- truncate_table(generate_overview.to_s) << "\n\n" <<
13
- truncate_table(generate_warning_overview.to_s) << "\n"
10
+ summary_option = tracker.options[:summary_only]
11
+ out = ""
12
+
13
+ unless summary_option == :no_summary
14
+ out << text_header <<
15
+ "\n\n+SUMMARY+\n\n" <<
16
+ truncate_table(generate_overview.to_s) << "\n\n" <<
17
+ truncate_table(generate_warning_overview.to_s) << "\n"
18
+ end
14
19
 
15
20
  #Return output early if only summarizing
16
- return out if tracker.options[:summary_only]
21
+ if summary_option == :summary_only or summary_option == true
22
+ return out
23
+ end
17
24
 
18
25
  if tracker.options[:report_routes] or tracker.options[:debug]
19
26
  out << "\n+CONTROLLERS+\n" <<
@@ -3,12 +3,18 @@ Brakeman.load_brakeman_dependency 'highline'
3
3
  class Brakeman::Report::Text < Brakeman::Report::Base
4
4
  def generate_report
5
5
  HighLine.use_color = !!tracker.options[:output_color]
6
+ summary_option = tracker.options[:summary_only]
6
7
  @output_string = "\n"
7
8
 
8
- add_chunk generate_header
9
- add_chunk generate_overview
10
- add_chunk generate_warning_overview
11
- return @output_string if tracker.options[:summary_only]
9
+ unless summary_option == :no_summary
10
+ add_chunk generate_header
11
+ add_chunk generate_overview
12
+ add_chunk generate_warning_overview
13
+ end
14
+
15
+ if summary_option == :summary_only or summary_option == true
16
+ return @output_string
17
+ end
12
18
 
13
19
  add_chunk generate_controllers if tracker.options[:debug] or tracker.options[:report_routes]
14
20
  add_chunk generate_templates if tracker.options[:debug]
@@ -126,6 +132,7 @@ class Brakeman::Report::Text < Brakeman::Report::Base
126
132
  out = [
127
133
  label('Confidence', confidence(w.confidence)),
128
134
  label('Category', w.warning_type.to_s),
135
+ label('Check', w.check.gsub(/^Brakeman::Check/, '')),
129
136
  label('Message', w.message)
130
137
  ]
131
138
 
@@ -198,6 +198,16 @@ class Brakeman::Tracker
198
198
  @constants.get_literal name unless @options[:disable_constant_tracking]
199
199
  end
200
200
 
201
+ def find_class name
202
+ [@controllers, @models, @libs].each do |collection|
203
+ if c = collection[name]
204
+ return c
205
+ end
206
+ end
207
+
208
+ nil
209
+ end
210
+
201
211
  def index_call_sites
202
212
  finder = Brakeman::FindAllCalls.new self
203
213
 
@@ -1,3 +1,3 @@
1
1
  module Brakeman
2
- Version = "3.4.1"
2
+ Version = "3.5.0"
3
3
  end
@@ -238,6 +238,7 @@ class Brakeman::Warning
238
238
  { :warning_type => self.warning_type,
239
239
  :warning_code => @warning_code,
240
240
  :fingerprint => self.fingerprint,
241
+ :check_name => self.check.gsub(/^Brakeman::Check/, ''),
241
242
  :message => self.message,
242
243
  :file => self.file,
243
244
  :line => self.line,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brakeman-lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.1
4
+ version: 3.5.0
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-11-02 00:00:00.000000000 Z
12
+ date: 2017-02-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
@@ -181,7 +181,6 @@ files:
181
181
  - CHANGES
182
182
  - FEATURES
183
183
  - README.md
184
- - WARNING_TYPES
185
184
  - bin/brakeman
186
185
  - lib/brakeman.rb
187
186
  - lib/brakeman/app_tree.rb
data/WARNING_TYPES DELETED
@@ -1,95 +0,0 @@
1
- This file describes the various warning types reported by this tool.
2
-
3
- # Attribute Restriction
4
-
5
- This warning comes up if a model does not limit what attributes can be set through mass assignment.
6
-
7
- In particular, this check looks for `attr_accessible` inside model definitions. If it is not found, this warning will be issued.
8
-
9
- Note that disabling mass assignment globally will suppress these warnings.
10
-
11
- # Authentication
12
-
13
- # Basic Auth
14
-
15
- # Command Injection
16
-
17
- Request parameters or string interpolation has been detected in a `system` call. This can lead to someone executing arbitrary commands. Use the safe form of `system` instead, which will pass in arguments safely.
18
-
19
- See http://guides.rubyonrails.org/security.html#command-line-injection for details.
20
-
21
- # Cross Site Scripting
22
-
23
- Cross site scripting warnings are raised when a parameter or model attribute is output through a view without being escaped.
24
-
25
- See http://guides.rubyonrails.org/security.html#cross-site-scripting-xss for details.
26
-
27
- # Cross-Site Request Forgery
28
-
29
- No call to `protect_from_forgery` was found in `ApplicationController`. This method prevents CSRF.
30
-
31
- See http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf for details.
32
-
33
- # Dangerous Eval
34
-
35
- # Dangerous Send
36
-
37
- # Default Routes
38
-
39
- The general default routes warning means there is a call to `map.connect ":controller/:action/:id"` in config/routes.rb. This allows any public method on any controller to be called as an action.
40
-
41
- If this warning is reported for a particular controller, it means there is a route to that controller containing `:action`.
42
-
43
- Default routes can be dangerous if methods are made public which are not intended to be used as URLs or actions.
44
-
45
- # Denial of Service
46
-
47
- # Dynamic Render Path
48
-
49
- When a call to `render` uses a dynamically generated path, template name, file name, or action, there is the possibility that a user can access templates that should be restricted. The issue may be worse if those templates execute code or modify the database.
50
-
51
- This warning is shown whenever the path to be rendered is not a static string or symbol.
52
-
53
- # File Access
54
-
55
- # Format Validation
56
-
57
- Calls to `validates_format_of ..., :with => //` which do not use `\A` and `\z` as anchors will cause this warning. Using `^` and `$` is not sufficient, as `$` will only match up to a new line. This allows an attacker to put whatever malicious input they would like after a new line character.
58
-
59
- See http://guides.rubyonrails.org/security.html#regular-expressions for details.
60
-
61
- # Information Disclosure
62
-
63
- # Mail Link
64
-
65
- # Mass Assignment
66
-
67
- Mass assignment is a method for initializing models. If the attributes which are set is not restricted, someone may set the attributes to any value they wish.
68
-
69
- Mass assignment can be disabled globally.
70
-
71
- Please see http://railspikes.com/2008/9/22/is-your-rails-application-safe-from-mass-assignment for more details.
72
-
73
- # Nested Attributes
74
-
75
- # Redirect
76
-
77
- Redirects which rely on user-supplied values can be used to "spoof" websites or hide malicious links in otherwise harmless-looking URLs. They can also allow access to restricted areas of a site if the destination is not validated.
78
-
79
- This warning is shown when request parameters are used inside a call to `redirect_to`.
80
-
81
- See http://www.owasp.org/index.php/Top_10_2010-A10 for more information.
82
-
83
- # Remote Code Execution
84
-
85
- # Response Splitting
86
-
87
- # Session Setting
88
-
89
- # SQL Injection
90
-
91
- String interpolation or concatenation has been detected in an SQL query. Use parameterized queries instead.
92
-
93
- See http://guides.rubyonrails.org/security.html#sql-injection for details.
94
-
95
- # SSL Verification Bypass