Ограничение манипулирования URL для возврата других записей пользователя - PullRequest
2 голосов
/ 06 января 2011

Я только начал Rails 3. Я сгенерировал приведенный ниже код, используя скаффолд из Rails 3 для таблицы под названием «Logs».

Функция 'index' ниже предоставляет только записи, связанные с current_user.id (из сеанса, хранящегося в таблице сеансов).Записи пользователей представлены только со следующим маршрутом, зарегистрированным как user = 3 (см. Код индекса ниже)

localhost: 3000 / logs

Проблема: Как пользователь, я могу просмотреть запись, которая не является моей записью (будучи пользователем = 3), отредактировав URL вручную, чтобы показать любую другую запись:

localhost: 3000 / logs / 5'это было введено user.id = 2'

Поиск решения : Как предотвратить взлом URL-адреса вручную для предотвращения просмотра пользователем других записей пользователя?

class LogsController

before_filter: login_required

def index 
  @logs = Log.where(:user_id => current_user)
  respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @logs }
end

Пожалуйста, игнорируйте, что новая функция отсутствует в функции создания ниже.Приведенный ниже код просто демонстрирует, как я помещаю user_id в таблицу «Logs»

def create
 @log = Log.new(params[:log])
 @log.user_id = current_user.id
  respond_to do |format|
  if @log.save
    format.html { redirect_to(@log)}
    format.xml  { render :xml => @log, :status => :created, :location => @log }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @log.errors, :status => :unprocessable_entity }
  end
end

1 Ответ

4 голосов
/ 06 января 2011

Самое простое решение - проверить в методе show, действительно ли отображаемый журнал принадлежит зарегистрированному пользователю:

def show
  @log = Log.find(params[:id])
  unless @log.user_id == current_user.id
    flash[:error] = "unauthorized"
    redirect_to :index
  end
end

Но вскоре у вас появятся еще некоторые вещи, к которым вы хотите ограничить доступ, поэтому вы должны искать плагин аутентификации, который позволяет определять права доступа декларативным способом.Может быть, это: https://github.com/be9/acl9

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...