Sha256: 1b266ff834dbdc6da7d299d1e9f3bf7e328572e67db4988ba8320bc92213719b

Contents?: true

Size: 1.57 KB

Versions: 17

Compression:

Stored size: 1.57 KB

Contents

require 'checks/base_check'

#Checks for mass assignments to models.
#
#See http://guides.rubyonrails.org/security.html#mass-assignment for details
class CheckMassAssignment < BaseCheck
  Checks.add self

  def run_check
    return if mass_assign_disabled? tracker

    models = []
    tracker.models.each do |name, m|
      if parent?(tracker, m, :"ActiveRecord::Base") and m[:attr_accessible].nil?
        models << name
      end
    end

    return if models.empty?

    @results = Set.new

    calls = tracker.find_call models, [:new,
      :attributes=, 
      :update_attribute, 
      :update_attributes, 
      :update_attributes!,
      :create,
      :create!]

    calls.each do |result|
      process result
    end
  end

  #All results should be Model.new(...) or Model.attributes=() calls
  def process_result res
    call = res[-1]

    check = check_call call

    if check and not @results.include? call
      @results << call

      if include_user_input? call[3]
        confidence = CONFIDENCE[:high]
      else
        confidence = CONFIDENCE[:med]
      end
      
      warn :result => res, 
        :warning_type => "Mass Assignment", 
        :message => "Unprotected mass assignment",
        :line => call.line,
        :code => call, 
        :confidence => confidence
    end
    res
  end

  #Want to ignore calls to Model.new that have no arguments
  def check_call call
    args = process call[3]
    if args.length <= 1 #empty new()
      false
    elsif hash? args[1]
      #Still should probably check contents of hash
      false
    else
      true
    end
  end

end

Version data entries

17 entries across 17 versions & 2 rubygems

Version Path
brakeman-0.7.2 lib/checks/check_mass_assignment.rb
brakeman-0.7.1 lib/checks/check_mass_assignment.rb
brakeman-0.7.0 lib/checks/check_mass_assignment.rb
brakeman-0.6.1 lib/checks/check_mass_assignment.rb
brakeman-0.6.0 lib/checks/check_mass_assignment.rb
brakeman-min-0.5.2 lib/checks/check_mass_assignment.rb
brakeman-0.5.2 lib/checks/check_mass_assignment.rb
brakeman-min-0.5.1 lib/checks/check_mass_assignment.rb
brakeman-0.5.1 lib/checks/check_mass_assignment.rb
brakeman-min-0.5.0 lib/checks/check_mass_assignment.rb
brakeman-0.5.0 lib/checks/check_mass_assignment.rb
brakeman-0.4.1 lib/checks/check_mass_assignment.rb
brakeman-min-0.4.1 lib/checks/check_mass_assignment.rb
brakeman-min-0.4.0 lib/checks/check_mass_assignment.rb
brakeman-0.4.0 lib/checks/check_mass_assignment.rb
brakeman-min-0.3.2 lib/checks/check_mass_assignment.rb
brakeman-0.3.2 lib/checks/check_mass_assignment.rb