¿Hay alguna solución disponible para proporcionar soporte XSRF/CSRF para Google App Engine?
-
28-10-2019 - |
Pregunta
Falsificación de solicitud de sitio cruzado es común en la web hoy en día. Me enfrento a esto en mi propio sitio implementado en Google App Engine. Llegué a saber esto examinando los registros de acceso. ¿Hay alguna biblioteca XSRF/CSRF u otra solución disponible para el motor de aplicaciones que pueda usar? Y, ¿cuánta carga agregará a mi sitio?
Solución
Utilizo este código llamado desde la función de solicitud de inicio de BaseHandler
def init_csrf(self):
"""Issue and handle CSRF token as necessary"""
self.csrf_token = self.request.cookies.get('c')
if not self.csrf_token:
self.csrf_token = str(uuid4())[:8]
self.set_cookie('c', self.csrf_token)
if self.request.method == 'POST' and self.csrf_protect \
and self.csrf_token != self.request.get('_csrf_token'):
raise CsrfException('Missing or invalid CSRF token.')
Lo tomé de Aplicación de lienzo de ejemplo de Facebook Incluye código para manejar CRSF. No lo probé prácticamente, pero lo incluyo en mi proyecto ya que tengo una aplicación de lienzo para Facebook que se ejecuta en FB como un iframe. Hace que cada controlador de solicitud tenga una variable de instancia que puede establecer en falso si genera una excepción para los casos normales.
Todavía no lo probé a fondo, pero este es el material que tengo sobre los tokens CRSF para Google App Engine en Python. Si le gusta ver los detalles excepcionales cómo estoy aprendiendo a usarlo en estos días puede clonar mi repositorio.
Otros consejos
Tal vez puedas intentar usar el Django's Contrib CSRF Protection Middleware. No estoy seguro de que funcione fuera de la caja en Appengine, pero vale la pena disparar.
Hice un decorador:
def csrf_protected(handler):
def inner(self, *args, **kwargs):
token = self.request.params.get('token')
if token and self.session.get('csrf') == token:
self.session['csrf'] = uuid.uuid1().hex
handler(self, *args, **kwargs)
else:
self.abort(400)
return inner
Tener token en plantilla y sesión