#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
, мы можем извлекать записи. Мы попытались внедрить несколько функций, и нам удалось получить все записи.