Трер понял все правильно, но я все же хочу уточнить некоторые вещи и предоставить вам некоторые источники для справочного материала.Как сказал Тёр, НИКОГДА никогда не доверяйте вводимым пользователем данным, включая все заголовки, отправленные браузером.
То, что вы описываете, является типичной атакой подделки межсайтовых запросов.Проверка заголовка реферера не является действительной защитой от CSRF-атак, поскольку в соответствии с RFC2616 ( Протокол передачи гипертекста 1.1 ) заголовок реферера является необязательным и, следовательно, может быть пропущен браузером в любое время.Если вы используете SSL, то браузер всегда пропускает заголовок реферера.Во-вторых, это определенное пользователем значение, и поэтому ему нельзя доверять.
Рекомендуемая защита от CSRF-атак заключается в использовании синхронизированного шаблона токенов.Это означает, что вы должны создать секретный токен, который будет встроен в вашу форму как скрытое поле.Когда форма публикуется, вы проверяете наличие секретного токена и его действительность.Существует несколько стратегий создания токенов безопасности.Я опишу один из способов создания токенов:
Для каждого действия в вашем приложении создайте для него уникальное имя действия.Например, «delete_user», «add_user» или «save_user_profile».Предположим, что форма, которую вы описали, имеет имя действия «foobar».Объедините имя действия с идентификатором сеанса пользователя и секретным значением.
$stringValue = "foobar" . "secret value" . session_id();
Чтобы создать токен безопасности, создайте хеш связанной строки, вы можете использовать sha1 для созданияхэш.Чтобы уменьшить риск атак грубой силой, используйте ключ большего размера в хэше, например, sha 512.
$secretToken = hash("sha5125", $stringValue);
Установите этот токен в скрытом поле вашей формы.Когда форма отправлена, заново создайте токен и убедитесь, что он совпадает с представленным в форме.Этот токен действителен для одного сеанса пользователя.Можно утверждать, что существует окно возможностей, где злоумышленник может повторно использовать токен, поскольку он не генерируется повторно при каждом запросе.Однако при правильной стратегии управления сессиями это не должно вызывать беспокойства.
Как я уже сказал, правильное управление сессиями необходимо.Это означает, что вы не должны поддерживать сессии долгое время.Особенно уязвимости фиксации сеанса отменят любые меры защиты CSRF, так как злоумышленник контролирует сеанс пользователя и, следовательно, может "предсказать" секретные токены.
Вот несколько ссылокрекомендую прочитать: