2015-05-17 2 views
1

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

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

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

Я знаю, что Rails использует хранилище сеансов на основе файлов cookie. Тем не менее, Rails 4 относительно безопасно использовать файлы cookie, так как вам понадобится 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)) 

Как я могу удалить эту уязвимость, и в то же время сделать мой код DRY?

+0

Для последнего является «значением» ввода от пользователя? – fatfrog

+0

Да, это может быть электронное письмо или имя пользователя – abhinavmsra

+0

Для меня второй выглядит хорошо - это было бы проблемой, если бы у вас был User.where ("# {type} = # {value}). - Не знаю, почему brakeman что это https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet#SQL_Injection - это драгоценный камень на сегодняшний день? – fatfrog

ответ

0

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

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

User.where(type.to_sym => value) 

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

User.where("%s = %s" % [type, "'#{value}'"])