Cross-site request forgery在网络上很常见。我在部署在Google App引擎上的我自己的网站上面对此问题。我通过检查访问日志来了解这一点。是否有可用于App引擎的XSRF / CSRF库或其他解决方案。并且,它将为我的网站添加多少负载?
答案 0 :(得分:10)
我使用从basehandler的init请求函数调用的代码
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's example canvas application包含代码来处理crsf。我实际上并没有对它进行太多的测试,但是我将它包含在我的项目中,因为我有一个Facebook的画布应用程序,在FB中作为iframe运行。它使每个请求处理程序都有一个实例变量,如果它为正常情况生成异常,则可以将其设置为false。
我还没有彻底测试它,但这是我在python中使用Google App Engine的CRSF令牌的材料。如果您想查看详细信息,我现在可以学习如何使用它,您可以克隆my repository。
答案 1 :(得分:6)
也许您可以尝试使用Django's contrib csrf protection middleware。不确定它是否会在AppEngine中开箱即用,但值得一试。
答案 2 :(得分: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
在模板和会话中有令牌