Средства поиска на основе динамических атрибутов в активной записи 3.2.10

Я энтузиаст безопасности и абсолютный новичок в RoR. Теперь есть этот блог, с которым я сталкивался относительно SQL-инъекций в RoR с активными записями.

SQLi в RoR Active Records

Однако сам блог восходит к январю 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 на что.

Другие вопросы по тегам