有针对Google App Engine提供XSRF/CSRF支持的解决方案吗?

18 投票
3 回答
3544 浏览
提问于 2025-04-17 07:43

跨站请求伪造现在在网络上很常见。我在自己部署在Google App Engine上的网站上遇到了这个问题。我是通过查看访问日志发现的。请问有没有适合App Engine的XSRF/CSRF库或者其他解决方案可以使用?这样会给我的网站增加多少负担呢?

3 个回答

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

在模板和会话中都有令牌

6

你可以试试使用 Django的CSRF保护中间件。我不太确定它在AppEngine上能否直接使用,但值得一试。

11

我在基类处理程序的初始化请求函数中使用了这段代码。

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的示例画布应用中拿来的,里面包含了处理CSRF的代码。我并没有进行太多实际测试,但我把它放进了我的项目里,因为我有一个在Facebook中以iframe形式运行的画布应用。这样,每个请求处理程序都有一个实例变量,如果在正常情况下发生异常,你可以把它设置为false。

我还没有彻底测试过,但这是我关于Google App Engine中Python的CSRF令牌的资料。如果你想了解我最近是如何学习使用它的,可以克隆我的代码库

撰写回答