Как избежать SQL-инъекции в Rails с помощью Ransack

#ruby-on-rails #ruby #ruby-on-rails-4 #activerecord #ransack

#ruby-on-rails #ruby #ruby-on-rails-4 #activerecord #ransack

Вопрос:

Как мы можем удалить слепую инъекцию SQL следующим методом?

 def self.with_translation_value_of_language_id_eq(language_id)
    joins('LEFT JOIN BOTranslationValue on BOTranslationToken.id = BOTranslationValue.boTranslationTokenID '
          "AND BOTranslationValue.languageID = #{language_id}")
      .select('BOTranslationToken.*, BOTranslationValue.value as current_language_value')
  end
  

Я пробовал sanitize_sql_array , но это не работает.

И также следующим образом

 def self.with_translation_value_of_language_id_eq(language_id)
    joins('LEFT JOIN BOTranslationValue on BOTranslationToken.id = BOTranslationValue.boTranslationTokenID '
          "AND BOTranslationValue.languageID = ?" language_id )
      .select('BOTranslationToken.*, BOTranslationValue.value as current_language_value')
  end
  

Я пробовал несколько способов, но ни один из них не сработал.

Кто-нибудь может мне помочь с этим?

Комментарии:

1. Что такое self class, означает название модели?

2. Какую ошибку вы получаете при выполнении вашего второго метода? Кажется, все в порядке (за исключением пропущенной запятой перед language_id)

3. Что вы подразумеваете под «это не работает»? Есть ли ошибка? О чем говорит ошибка? Если ошибки нет, то какой результат вы получаете? Какого результата вы ожидали?

4. Я не вижу ничего плохого в вашем коде, кроме пропущенной запятой. Альтернативно, как ленивое (!!) решение, вы могли бы придерживаться оригинальной реализации, но заменить language_id на language_id.to_i — вы не можете вводить SQL с целым числом 🙂

5. Это не работает, означает, что значение не очищается. Да, я пытался language_id.to_i , но это тоже не работает.

Ответ №1:

Вы забыли добавить запятую , после ? , и вы не передаете правильное условие where, предполагая, что BOTranslationValue и BOTranslationToken являются правильными именами таблиц, попробуйте следующий запрос:

 def self.with_translation_value_of_language_id_eq(language_id)
  joins('BOTranslationValue on BOTranslationToken.id = BOTranslationValue.boTranslationTokenID ')
 .where("BOTranslationValue.languageID = ?", language_id)
 .select('BOTranslationToken.*, BOTranslationValue.value as current_language_value')
end
  

Комментарии:

1. Ой, извините, это была опечатка при добавлении вопроса. Но я пытался с помощью ‘,’

2. можете ли вы попробовать вышеуказанное?

3. Да, я пробовал вышеуказанный способ, но он уязвим для слепой SQL-инъекции.

4. нет, он не уязвим для SQL-инъекции, потому что мы передаем language_id в качестве параметра. Если мы передадим language_id в двойных кавычках, то это приведет к SQL-инъекции

5. 1 and NULL IS NULL мы пытаемся очистить эту ценность. Или когда это значение передается как language_id , мы можем извлекать записи. Мы попытались внедрить несколько функций, и нам удалось получить все записи.