Rails - SQL внедрение с использованием .order для фильтрации индекса - PullRequest
0 голосов
/ 27 апреля 2020

В моем индексном представлении я перебираю список заказов.

Также я добавил выпадающее меню с возможностью сортировки по creation_at: as c и create_at: des c.

index. html .erb

<div class="dropdown">
  <button class="btn" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
     Sort by
   </button>
   <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
     <p> <%= link_to "ASC", sort: :asc %> </p>
     <p> <%= link_to "DESC", sort: :desc %> </p>
   </div>
 </div>

<% @bookings.each do |booking| %>
  <%= booking.address %>
  <%= booking.created_at %>
<% end %>


Так я сортирую @ bookings в контроллере:

booking_controller. rb

class Users::BookingsController < ApplicationController
  def index
    @bookings = current_user.bookings.order(created_at: params[:sort])
  end
end

Я не совсем уверен, является ли это лучшим решением и имеет ли оно какую-то уязвимость с точки зрения SQL инъекций ...

1 Ответ

0 голосов
/ 27 апреля 2020

Я не вижу никаких SQL возможностей для инъекций. Методы ActiveRecord, которые принимают параметры, такие как order, обычно безопасны.

Однако, поскольку Sumak указывает , передача строковых параметров небезопасна. order("created_at #{params[:sort]}") теоретически открыто для SQL инъекции. См. rails-sqli.org для получения дополнительной информации об уязвимостях.

Более новые версии Rails устарели и предупредят вас.

ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: Опасный метод запроса ( метод, аргументы которого используются как raw SQL), вызываемый с неатрибутивным аргументом (ами)

Линтеры, такие как rubocop-rails , проверит ваш код за вас. И вы можете следовать Руководству по стилю Rails , чтобы избежать проблем с безопасностью.


Ваш взгляд не превращает заказы в выпадающее меню. Вместо этого это просто куча текста. Как подсказал lurker , используйте такую ​​функцию, как collection_select, чтобы сгенерировать для вас теги select и option.

<%= form_for @user do |f| %>
  <%= f.collection_select :booking_id, @bookings, :id, proc { |b| "#{b.address} #{b.created_at}" , prompt: true %>
  <%= f.submit %>
<% end %>

Чтобы привести это в порядок немного, вы можете добавить метод в Booking для создания нужного ярлыка и заменить proc.

class Booking
  def dropdown_value
    "#{address} #{created_at}"
  end
end

<%= form_for @user do |f| %>
  <%= f.collection_select :booking_id, @bookings, :id, :dropdown_value, prompt: true %>
  <%= f.submit %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...