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