Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
В разрабатываемом приложении при успешной аутентификации пользователь попадает в личный кабинет. В личном кабинете он получает возможность оперировать различными сущностями. Для сущностей реализованы операции создания, чтения, редактирования и удаления(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-х cookies — логин и права доступа, то могли бы избежать запросов к БД, добавив 3-й cookie:
$hash = md5("$login\0$access\0randomuniquestring");
randomuniquestring аналогичен application.key — случайная строка, которая уникальна для этого вёб-приложения (а не генерируется случайно для каждого запроса).
Соответственно, при разборе 2-х cookie с логином и паролем мы проверяем их на соответствие кэшу (который хранится в 3-м cookie) и если хэши разные, считаем, что пользователь не авторизован. Именно такую схему подписывания cookie применяет Laravel.
В твоём случае с формой можно сделать тоже самое — добавь скрытое поле с хэшем и проверяй его при обработке формы.
Не в сети
Если пользуетесь стандартными драйверами авторизации, то атрибуты пользователя(если он авторизован) проверяются при каждом запросе. Поставьте в config/application 'profiler' => true, и убедитесь. Можно прописать before фильтр, в котором проверять принадлежит ли сущность пользователю, может ли он ее редактировать и тд. Жутко удобная штука. Плюс ко всему фильтры можно группировать, что избавит вас от рутины.
В твоём случае с формой можно сделать тоже самое — добавь скрытое поле с хэшем и проверяй его при обработке формы.
А разве при {{ Form::token() }} этого не происходит?
Изменено Cheshirrski (01.10.2012 18:07:20)
Не в сети
- Если пользуетесь стандартными драйверами авторизации, то атрибуты пользователя(если он авторизован) проверяются при каждом запросе.
Я говорил не об авторизации в Laravel, а о возможном механизме авторизации вообще (в частности, я его давно использовал в своих проектах не на Laravel).
- Именно такую схему подписывания cookie применяет Laravel.
Ещё раз: здесь я имел в виду именно работу с cookie, а не механизм авторизации. Зайди на главную и посмотри на значение laravel_session — это будет что-то типа:
380b35a5eee251c2289dc5645fc74afc4c9685fd~QzHnxlYLhLGrV5jruJDbjsyEw9ywXEoxSkGlMjFW
Часть перед тильдой — и есть хэш, см. PHPCookie::sign()
.
- А разве при This {{Action}} has wrong syntax and can’t be executed. этого не происходит?
Нет. CSRF — способ удостовериться, что запрос исходит от пользователя, а не подставлен кем-то извне; при этом, однако, не проверяется никакое соответствие данных в форме, скрытых полей и прочего тому, что изначально сгенерировала страница.
В Laravel «token» хранится в сессии, поэтому он будет всегда одинаков для каждого конкретного пользователя вне зависимости от того, какую форму и данные он отправляет.
Не в сети
Страницы 1