Средства поиска на основе динамических атрибутов в активной записи 3.2.10
Я энтузиаст безопасности и абсолютный новичок в RoR. Теперь есть этот блог, с которым я сталкивался относительно SQL-инъекций в RoR с активными записями.
Однако сам блог восходит к январю 2013 года. Тем не менее, я попытался воспроизвести SQLi в тестовой среде с Rails 4.2 и ActiveRecord 4.2.
Я пытался с помощью:
User.find_by_name("kotori", :select => "id, name")
из блога выше, но я получил следующую ошибку:
ArgumentError: неверное количество аргументов (2 для 1)
Мыслительный процесс: Поскольку блог довольно старый, возможно, это устаревшая функция в соответствии с моей настройкой теста. Теперь блог был с 13 января, поэтому я взял активную сборку записей с декабря 2012 года, думая, что приведенный выше фрагмент кода определенно будет работать по крайней мере в этом выпуске, но ошибка была той же. Кроме того, я также попытался просмотреть документацию того же самого здесь, но это также не дает никакого понимания рассматриваемого фрагмента кода.
Что мне здесь не хватает? То, что упомянутый выше блог сам по себе ненадежен, или это действительно глупо:)
2 ответа
Я уверен, что :select => "id, name"
варианты в последний раз видели в Rails 2.3, довольно много лет назад. Поддержка сообщества (и любые исправления безопасности) для 2.3 закончилась около 3 лет назад, почти в то же время, когда была написана упомянутая статья, когда был выпущен Rails 4.0.
Информация была не только очень хорошо известна в то время, но уже была удалена из Rails 3.0 более чем за 3 года до статьи. Таким образом, автор использовал довольно значительно устаревшую информацию для поддержки статьи. Тогда определенно были еще сайты с 2.3, потому что они еще есть (см. Этот вопрос вчера). При чтении статьи это было по существу фактическим; однако, он использовал информацию, которая быстро стареет, чтобы обозначить ключевые моменты, но фактически не идентифицировал ее как таковую.
На современное время. Вы все еще можете достичь той же цели, но теперь это требует других средств. pluck
позволит вам выбрать конкретные столбцы (например, только id
а также name
поля), вот так:
User.where(name: 'kotori').pluck(:id, :name)
Это создаст оптимизированный оператор SQL, и, кроме того, поскольку нет фрагментов SQL, передаваемых в механизм запросов, нет возможности для внедрения SQL. Безопасность была высшим приоритетом сообщества Rails в течение достаточно долгого времени, и это хорошо.
find_by_name
ожидает только один аргумент, и это name
объекта, который вы хотите найти. И это вернет вам ActiveRecord
объект, на котором вы можете вызывать другие методы.
Другая вещь: find_by_name
возвращает только одну запись, так что вы можете сделать:
User.where(name: 'kotori').pluck(:id, :name)
Примечание: с find_by_name
возвращает один экземпляр, вы не можете позвонить pluck
на что.