2015-02-26 4 views
1

(Извиняюсь, если все это звучит банально, я новичок и с веб-программирования и Джанго)Безопасность отключения защиты от CSRF для API доступом в Джанго

Я пишу веб-интерфейс к базе данных научных измерений с Джанго ,

Часть необходимой функциональности - предоставить пользователям возможность отправлять новые измерения в базу данных с веб-страницы. У меня есть эта функциональность, работающая с помощью превосходной поддержки django для веб-форм. Данные отправляются через POST-запросы, защищенные токенами CSRF.

Я сейчас разрабатываю ту же функциональность не через веб-формы, а через API-интерфейс, так что пользователи могут делать, например, массовые представления новых измерений с помощью скрипта Python без необходимости заполнять веб-форму каждый раз вручную ,

Проблема заключается в том, что, поскольку формы не заполняется, не существует также токена CSRF, и django не разрешает по умолчанию отправлять запросы POST без него.

На данный момент я столкнулся с проблемой, украсив представление API с помощью @csrf_exempt. Но я не понимаю, как это влияет на безопасность.

Это может быть риск для безопасности? Если да, то как?

ответ

1

Это вызывающе угроза безопасности, так как любой сайт/сценарий/бот может отправлять POST-данные, которые будут обрабатываться вашим бэкэнд.

Если вы хотите предоставить общедоступный/анонимный API, то, скорее всего, он будет очень осторожным, как вы обрабатываете полученные данные.

Если вы хотите предоставить пользователям/конкретным приложениям доступ, то вы должны сохранить токен CSRF и/или добавить другую меру безопасности.

с токенами CSRF, все, что вам нужно сделать, - это первый запрос к системе - запрос «GET», который проверяет подлинность пользователя (каким бы вы ни хотели) и затем возвращал токен CSRF (или некоторую другую безопасность токена, если вы хотите повысить безопасность).

затем все запросы на ваш API (для любой длины сеанса, которую вы установили, поскольку токен CSRF истечет в определенный неиспользованный временной интервал). Просто отправляет токен CSRF с данными POST (как и любая форма).

EDIT:

Если вы используете стандартный HTML, все получают запросы будут иметь заголовок "Set-Cookie", который содержит CSRFTOKEN. Таким образом, любая программа, использующая ваш API через HTTP, может получить этот заголовок, разобрать CSRFTOKEN и вернуться во все запросы POST как часть набора данных.

+0

Спасибо за ответ! Я немного запутался в обработке токенов. У меня уже есть код API, который аутентифицирует пользователя, заимствованный отсюда: http://www.forgottenlabs.com/how-to-authenticate-in-django-via-urllib2/ Что меня смущает: нужен ли мне новый токен при выполнении ПОСТ? Могу ли я повторно использовать токен, полученный на этапе аутентификации? – bluescarni

+0

Хорошо, я думаю, что, возможно, получил это: я заполнил шаблон только с '' {% csrf_token%} '', который я сначала сделал в запросе GET. Затем я разбираю токен и завершаю его в последовательный запрос POST. Кажется, теперь это работает. – bluescarni

+0

@bluescarni см. Правки –

Смежные вопросы