2014-10-20 2 views
0

Я использую рубин 1.8.7 и рельсы 2.3.2Каков наилучший способ избежать внедрения sql?

Следующий код склонен к SQL инъекции

params[:id] = "1) OR 1=1--" 
User.delete_all("id = #{params[:id]}") 

Мой вопрос, выполнив следующие действия будет лучшее решение, чтобы избежать SQL-инъекции или не. Если нет, то каков наилучший способ сделать это?

User.delete_all("id = #{params[:id].to_i}") 

ответ

2

насчет:

User.where(id: params[:id]).delete_all 

Ok жаль Rails 2.x его:

User.delete_all(["id = ?", params[:id]]) 

Check doc

Btw, убедитесь, что вы хотите использовать delete_all вместо destroy_all, первый не вызывает обратные вызовы.

+0

спасибо. Я полагаю, это лучший способ избежать внедрения sql. Есть ли недостаток в использовании to_i? –

+0

Не особенно, но я не вижу смысла в этой проверке paeudo либо – apneadiving

+0

Я имею в виду, что Rails обрабатывает это для вас, поэтому не загрязняйте свой код – apneadiving

1

Вы можете использовать это также

User.delete(params[:id]) 
0

Используйте методы рельсы, чтобы передать ваши where варианты. Вы всегда можете жёстко их, как в примере, что вы даете, но обычным способом было бы что-то вроде:

User.where(:id => params[:id]).delete_all 
User.where("id = ?", params[:id]).delete_all 
User.where("id = :id", :id => params[:id]).delete_all 

Они хорошо проверены и в случае, если новая уязвимость обнаружена, обновление будет решить эту проблему и ваш код не нужно менять.

Кстати, если вы просто хотите удалить 1 запись на основе его идентификатора, что я хотел бы сделать, это:

User.find (PARAMS [: ID]). Уничтожить

+0

Я использую старую версию ... –

1

Другие ответы ответьте на это хорошо для Rails, и он будет работать нормально, если вы будете следовать их предложениям. В более общей настройке, когда вы должны справиться с этим самостоятельно, вы обычно можете использовать регулярное выражение для извлечения значения, которое находится в ожидаемом формате. Это действительно просто с целым id. Подумайте об этом так:

if params[:id] =~ /(\d+)/ 
    safe_id = $1.to_i 
    # do something with safe_id now 
end 

Это становится немного сложнее, когда вы обрабатываете строки и произвольные данные. Если вам нужно обрабатывать такие данные, вы можете использовать методы цитирования, доступные для адаптеров базы данных. В Rails это в конечном счете свернутая в последовательный интерфейс:

safe_string = ActiveRecord::Base.connection.quote(unsafe_string) 

Для большинства систем баз данных это будет обрабатывать одинарные и слеш особым образом.

Если вы находитесь за пределами Rails, вам придется использовать методы цитирования, специфичные для вашего адаптера базы данных, но использование очень похоже.

вынос:

  1. Если данные имеют определенный формат, применять формат с регулярным выражением
  2. В противном случае, используйте квотирование функцию вашего адаптера базы данных, чтобы сделать данные «безопасным» для использования в запрос
  3. Rails будет обрабатывать большую часть этого для вас, если вы правильно использовать различные методы и «условие»
Смежные вопросы