Проблемы с безопасностью в Rails, поднятые Brakeman

В моем проекте при использовании драгоценного камня Brakeman возникают следующие проблемы безопасности:

1) В следующем утверждении Unescaped model attribute ошибка возникает

CashTransaction.find(session[:transaction_id]).customer.address_1

Я знаю, что Rails использует хранилище сессий на основе файлов cookie. Тем не менее, в Rails 4 относительно безопасно использовать куки, так как Rails secret token чтобы скомпрометировать это.

Итак, это ложный положительный результат? Если нет, то как я могу устранить эту уязвимость?

2) Во-вторых, у меня есть сценарий, в котором мне нужно проверить, существует запись или нет с типичным атрибутом. Для этого у меня есть следующий код

  def check_email
    render json: ( is_available('email', params[:user][:email]) )
  end

  def is_email_available
    is_email_taken = is_available('email', params[:user][:email])
    render json: !is_email_taken
  end

  def is_username_available
    is_username_taken = is_available('username', params[:user][:username])
    render json: !is_username_taken
  end

  def is_available(type, value)
    User.where("#{type}=?", value).exists?
  end

И Бормман поднимает следующее предупреждение

Possible SQL injection. User.where("#{(local type)}=?", (local value))

Как я могу устранить эту уязвимость и в то же время сделать мой код СУХИМ?

1 ответ

Решение

Для второй части:

Если type это не пользовательский ввод, вы можете сделать

User.where(type.to_sym => value)

Если это пользовательский ввод, вы должны делать.

User.where("%s =  %s" % [type, "'#{value}'"])
Другие вопросы по тегам