Итак, как лучше всего предотвратить атаку XSRF для приложения GAE? Представьте себе следующее:
- Любой может видеть открытый объект пользователя, а идентификатор db.Model используется в запросе, чтобы выяснить, какой объект показывать. Злонамеренный пользователь теперь имеет идентификатор.
- Вредоносный пользователь создает собственный объект и проверяет форму удаления. Теперь они знают, как удалить объект с определенным идентификатором.
- Вредоносный пользователь заставляет невинного пользователя отправить запрос на удаление объекта этого пользователя.
Какие шаги я могу добавить, чтобы предотвратить # 3? Обратите внимание, что когда я говорю «ID», я использую фактическую часть «ID» ключа. У меня была идея использовать полное значение ключа в запросах на удаление, но помешает ли это злоумышленнику понять это? Насколько я знаю, ключ - это некоторая комбинация типа класса модели, идентификатора приложения и идентификатора экземпляра объекта, поэтому они, возможно, могут получить ключ из идентификатора, если захотят.
Есть еще идеи? Джефф написал пост об этом и предложил несколько методов - скрытое значение формы, которое будет меняться при каждом запросе, и значение cookie, записываемое через js в форму. Я не хочу исключать пользователей, не поддерживающих JavaScript, поэтому решение для файлов cookie не годится - для значения скрытой формы мне придется выполнять запись в хранилище данных при каждом запросе, отображающем удаляемый объект, - не идеальная ситуация для масштабируемой приложение!
Есть еще какие-нибудь идеи?