Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 01.10.2012 16:51:55

Маршрутизация внутри многопользовательского приложения

В разрабатываемом приложении при успешной аутентификации пользователь попадает в личный кабинет. В личном кабинете он получает возможность оперировать различными сущностями. Для сущностей реализованы операции создания, чтения, редактирования и удаления(CRUD). Определение конкретной сущности, с которой работает пользователь, производится через ее идентификатор. Идентификатор передается следующим образом:

   {{ HTML::link_to_route('system_create', 'ADD SYSTEM', $id) }}

или

  {{ Form::open('system/delete','Delete') }}
                {{ Form::token() }}
                {{ Form::hidden('id', $id) }}
                {{ Form::submit('Delete') }}
   {{ Form::close() }}                    

   Проблема состоит в том что пользователь получает возможность подменить идентификатор и получить доступ к чужим сущностям.
Необходимо ли при каждом запросе пользователя проверять его атрибуты, с запросами в базу? Либо есть другой способ обеспечить безопасность и сохранность данных. Расскажите каким образом вы решаете проблемы подобного рода?

Не в сети

#2 01.10.2012 17:42:44

Re: Маршрутизация внутри многопользовательского приложения

Обычно когда нужно убедиться в том, что клиент не подкрутил какие-то данные, используется хэш, уникальный конкретно для этой комбинации значений и алгоритм генерации которого клиент не знает.

Например, если бы мы хранили авторизацию с помощью 2-х cookies — логин и права доступа, то могли бы избежать запросов к БД, добавив 3-й cookie:

PHP
$hash md5("$login\0$access\0randomuniquestring");

randomuniquestring аналогичен application.key — случайная строка, которая уникальна для этого вёб-приложения (а не генерируется случайно для каждого запроса).

Соответственно, при разборе 2-х cookie с логином и паролем мы проверяем их на соответствие кэшу (который хранится в 3-м cookie) и если хэши разные, считаем, что пользователь не авторизован. Именно такую схему подписывания cookie применяет Laravel.

В твоём случае с формой можно сделать тоже самое — добавь скрытое поле с хэшем и проверяй его при обработке формы.

Не в сети

#3 01.10.2012 18:06:27

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Маршрутизация внутри многопользовательского приложения

Если пользуетесь стандартными драйверами авторизации, то атрибуты пользователя(если он авторизован) проверяются при каждом запросе. Поставьте в config/application 'profiler' => true, и убедитесь. Можно прописать before фильтр, в котором проверять принадлежит ли сущность пользователю, может ли он ее редактировать и тд. Жутко удобная штука. Плюс ко всему фильтры можно группировать, что избавит вас от рутины.

Proger_XP пишет:

В твоём случае с формой можно сделать тоже самое — добавь скрытое поле с хэшем и проверяй его при обработке формы.

А разве при {{ Form::token() }} этого не происходит?

Изменено Cheshirrski (01.10.2012 18:07:20)

Не в сети

#4 01.10.2012 18:52:17

Re: Маршрутизация внутри многопользовательского приложения

  1. Если пользуетесь стандартными драйверами авторизации, то атрибуты пользователя(если он авторизован) проверяются при каждом запросе.

Я говорил не об авторизации в Laravel, а о возможном механизме авторизации вообще (в частности, я его давно использовал в своих проектах не на Laravel).

  1. Именно такую схему подписывания cookie применяет Laravel.

Ещё раз: здесь я имел в виду именно работу с cookie, а не механизм авторизации. Зайди на главную и посмотри на значение laravel_session — это будет что-то типа:

380b35a5eee251c2289dc5645fc74afc4c9685fd~QzHnxlYLhLGrV5jruJDbjsyEw9ywXEoxSkGlMjFW

Часть перед тильдой — и есть хэш, см. PHPCookie::sign().

  1. А разве при This {{Action}} has wrong syntax and can’t be executed. этого не происходит?

Нет. CSRF — способ удостовериться, что запрос исходит от пользователя, а не подставлен кем-то извне; при этом, однако, не проверяется никакое соответствие данных в форме, скрытых полей и прочего тому, что изначально сгенерировала страница.

В Laravel «token» хранится в сессии, поэтому он будет всегда одинаков для каждого конкретного пользователя вне зависимости от того, какую форму и данные он отправляет.

Не в сети

Подвал раздела