• Как предотовратить одинаковые запросы от пользователя?

    @dimbo
    Обычно, если форма отправляется по нажатию кнопки, эта кнопку нужно сразу после нажатия перевести в состояние disabled (в обработчике onClick). Тогда нажать кнопку несколько раз подряд просто не получится.

    Но, на сколько я понял, вы боитесь, что пользователь отредактирует JS в браузере и отправит данные заново с помощью измененного JS. Если это так, то нужно сказать, что любой POST-запрос можно таким образом продублировать - для этого даже не обязательно редактировать JS, можно использовать утилиты типа curl или wget, либо некоторые расширения браузера. Я бы рекомендовал не беспокоиться по этому поводу.

    Но если вы все же хотите застраховаться от этого - генерируйте на сервере особый одноразовый ключ при генерации страницы с формой и включайте его в форму в виде hidden поля. (При использовании фреймворка PHP Laravel для этого можно воспользоваться функцией str_random()) Сохраняйте этот ключ в данных сессии и затем, при получении данных формы, проверяйте: если пришедший с данными формы ключ существует в данных сессии, то продолжить обработку и затем удалить ключ; если же пришедший с формой ключ в данных сессии отсутствует, то возвращайте ошибку 403 Bad request.
    Ответ написан
    Комментировать
  • Почему на production не рекомендуют использовать систему контроля версий?

    @dimbo
    Действительно, это довольно удобно. Но в такой простоте есть риск выкатывания на production не протестированного должным образом кода. Использование системы continuous integration с настроенными автотестами дает некоторый уровень гарантии.
    Ответ написан
    Комментировать
  • Подробнее про блокировки и в laravel в частности?

    @dimbo
    Если в используете PostgreSQL, я бы рекомендовал использовать advisory locks (см. https://www.postgresql.org/docs/current/static/exp..., в конце страницы). По сути, это реализация мьютексов на уровне базы данных.

    Трейт для PHP, использующий advisory locks, можно посмотреть здесь: https://gist.github.com/dfbag7/75dcd78a33a6a6d8b61... Этот трейт можно подключать к классам моделей. Также см. реализацию scope: https://gist.github.com/dfbag7/75a0a1ca843e5e14258... Код проверялся (и реально используется) в Laravel 4.2.
    Ответ написан
    Комментировать