您的位置:

HTTPError(403, "XSRF cookie does not match POST argument")的处理方案

  发布时间:2023-01-23 15:30:02
报错的原因是由于在使用Tornado的XSRF保护功能时发生的错误。这通常是由于在表单提交或Ajax请求中缺少或无效的XSRF token导致的。在Tornado中,当用户提交表单或发送Ajax请求时,应用程序会在响应中设置一个XSRF cookie,并要求在请求中包含对应的XSRF token。解决这个问题可以在客户端使用Tornado的XSRF保护功能生成的XSRF token,并在服务端使用Tornado提供的xsrf_token()函数验证XSRF token。需要注意的是, 在服务端需要使用或者装饰器来开启XSRF保护, 如果你没有使用这个装饰器, 将不会开启XSRF保护。

报错的原因

HTTPError(403, "XSRF cookie does not match POST argument")是由于在使用Tornado的XSRF保护功能时发生的错误。这通常是由于在表单提交或Ajax请求中缺少或无效的XSRF token导致的。

在Tornado中,当用户提交表单或发送Ajax请求时,应用程序会在响应中设置一个XSRF cookie,并要求在请求中包含对应的XSRF token。如果在请求中缺少或无效的XSRF token,应用程序将会抛出HTTPError异常。

这个错误可能是由于在客户端没有正确设置XSRF token或者服务端没有正确验证XSRF token导致的。

户端在请求中正确设置XSRF token,并在服务端正确验证XSRF token

解决这个问题可以在客户端使用Tornado的XSRF保护功能生成的XSRF token,并在服务端使用Tornado提供的xsrf_token()函数验证XSRF token。例如:


from tornado.web import RequestHandler

class MyHandler(RequestHandler):
    def post(self):
        xsrf_token = self.get_argument("_xsrf")
        if self.xsrf_token != xsrf_token:
            raise HTTPError(403, "XSRF cookie does not match POST argument")

如何解决

那应该怎么解决?

解决这个问题需要在客户端和服务端正确设置和验证XSRF token

客户端:

- 在HTML表单中包含一个名为_xsrf的隐藏字段,值为Tornado生成的XSRF token

- 在Ajax请求中使用setRequestHeader()函数设置X-XSRFToken请求头,并将其设置为Tornado生成的XSRF token

服务端:

- 使用Tornado提供的xsrf_token()函数在响应中设置XSRF cookie。

- 使用Tornado提供的xsrf_token()函数验证请求中的XSRF token

例如:


#客户端
#服务端 class MyHandler(RequestHandler): def post(self): xsrf_token = self.get_argument("_xsrf") if self.

使用例子

是的,有。例如在客户端HTML中:


客户端Javascript中:


var xhr = new XMLHttpRequest();
xhr.open("POST", "/some-url", true);
xhr.setRequestHeader("X-XSRFToken", "{{ xsrf_token }}");
xhr.send(data);

服务端:


class MyHandler(RequestHandler):
    def post(self):
        xsrf_token = self.get_argument("_xsrf")
        if self.xsrf_token != xsrf_token:
            raise HTTPError(403, "XSRF cookie does not match POST argument")

在这个例子中,我们在客户端HTML中包含了一个隐藏字段,并在客户端Javascript中设置了X-XSRFToken请求头。在服务端,我们使用get_argument()函数获取请求中的XSRF token,并使用xsrf_token()函数验证它。

需要注意的是, 在服务端需要使用 @tornado.web.authenticated 或者 @tornado.web.asynchronous 装饰器来开启XSRF保护, 如果你没有使用这个装饰器, 将不会开启XSRF保护。