Моделирование CSRF атаки в Django
Я пытаюсь понять, как работают CSRF-токены, в настоящее время моя цель - создать ситуацию, в которой возможна CSRF-атака. Я размещаю два приложения Django локально на разных портах. К одному я обращаюсь по localhost:8000, к другому по 127.0.0.1:5000 - это гарантирует, что cookies не будут общими между приложениями. Есть представление API
class ModifyDB(APIView):
def post(self,request,format=None):
if request.user.is_authenticated:
return Response({'db modified'})
else:
return Response({'you need to be authenticated'})
к которым не должны иметь доступ неаутентифицированные пользователи.
На "вредоносном" сайте есть кнопка, которая должна вызвать атаку, когда пользователь заходит на целевой сайт:
const Modify = () => {
const onClick = async e => { e.preventDefault();
const instance = axios.create({
withCredentials: true,
baseURL: 'http://localhost:8000',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
}
})
const res = await instance.post('/api/modifydb');
return res.data
}
return (
<button class = 'btn' onClick = {onClick}> send request </button>
)
}
Мои настройки аутентификации следующие:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'my_proj.settings.CsrfExemptSessionAuthentication',
],
}
где CsrfExemptSessionAuthentication
- это пользовательский класс, который отключает защиту csrf для моих образовательных целей:
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return
django.middleware.csrf.CsrfViewMiddleware
также отключен.
Оба параметра CORS_ALLOW_ALL_ORIGINS
и CORS_ALLOW_CREDENTIALS
установлены в true. Мой первый вопрос: что я делаю не так, потому что когда я вхожу на атакованный сайт, этот axios запрос с вредоносного сайта возвращает ответ "you need to be authenticated"
.
Я ожидал, что каким-то образом sessionid cookie будет включен и запрос будет успешным (это логика этого типа атаки, если я правильно понимаю).
Второй вопрос: будет ли CSRF атака возможна, если CORS не разрешен?