17

现在,跨站点请求伪造在网络上很常见。我在部署在 Google App 引擎上的自己的站点中面临这个问题。我通过检查访问日志了解了这一点。是否有任何 XSRF/CSRF 库或其他可用于我可以使用的 App 引擎的解决方案。而且,它会给我的网站增加多少负载?

4

3 回答 3

10

我使用从 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.')

我从Facebook 的示例画布应用程序中获取它,其中包含处理 crsf 的代码。我实际上并没有对其进行太多测试,但我将它包含在我的项目中,因为我有一个用于 Facebook 的画布应用程序,它作为 iframe 在 FB 中运行。它使每个请求处理程序都有一个实例变量,如果它在正常情况下生成异常,您可以将其设置为 false。

我还没有彻底测试它,但这是我在 python 中关于 Google App Engine 的 CRSF 令牌的材料。如果您想详细了解这些天我是如何学习如何使用它的,您可以克隆我的存储库

于 2011-12-17T13:49:15.633 回答
6

也许你可以尝试使用Django 的 contrib csrf protection middleware。不确定它是否可以在 AppEngine 中开箱即用,但值得一试。

于 2011-12-19T21:52:34.283 回答
5

我做了一个装饰器:

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

在模板和会话中有令牌

于 2013-12-04T21:24:36.197 回答