¿Hay alguna solución disponible para proporcionar soporte XSRF/CSRF para Google App Engine?

StackOverflow https://stackoverflow.com/questions/8384729

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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top