Ответ 1
Риск CSRF заключается в том, что внешний сайт может отправлять данные на ваш компьютер, и браузер пользователей автоматически отправит cookie аутентификации вместе с ним.
Что вам нужно - это какой-то способ для принимающего действия (который ваш метод $.ajax()
отправляет данные POST), чтобы проверить, что запрос пришел с другой страницы вашего сайта, а не на внешний сайт.
Существует несколько способов сделать это, но рекомендуемый способ - добавить токен в запрос, который вы можете проверить, и что хакеры не могут добраться.
В самом простейшем:
- При входе в систему создайте длинный случайный токен и сохраните его против пользователя.
- Добавьте параметр в запрос
$.ajax()
, который включает токен. - По запросу проверьте, совпадает ли токен с тем, который вы сохранили для пользователя.
- Если токен не соответствует, у вас есть CSRF-хак.
Хакер не может попасть в вашу БД и фактически не может прочитать страницу, которую вы отправили пользователю (если только они не получают атаку XSS, но эта другая проблема), поэтому не может подделать токен.
Все, что имеет значение с токеном, - это то, что вы можете предсказать (и проверить) его и что хакер не может.
По этой причине проще всего генерировать что-то длинное и случайное и хранить его в БД, но вместо этого вы можете создать что-то зашифрованное. Я бы не просто MD5 - это имя пользователя - если злоумышленники CSRF выясняют, как сгенерировать ваши токены, вы будете взломаны.
Другой способ хранения маркера заключается в cookie (а не в вашей базе данных), так как злоумышленники не могут читать или изменять ваши файлы cookie, а просто заставляют их повторно отправлять. Затем вы являетесь токеном в HTTP POST-данных, сопоставляете токен в файле cookie.
Вы можете сделать их намного более сложными, например, токен, который изменяется каждый раз, когда он успешно используется (предотвращение повторной отправки) или токен, специфичный для пользователя и действия, но тот основной шаблон.