不使用模板引擎的CSRF保护-Javascript和Flask

不使用模板引擎的CSRF保护-Javascript和Flask,javascript,python,html,flask,csrf,Javascript,Python,Html,Flask,Csrf,我有一个我正在编写的单页webapp,它将接受用户名和api键,并执行REST完整api调用。由于用户对其帐户使用apikey,因此无需登录。我没有用乙醚 在后端,我使用一个简单的flask服务器。前端是一个自定义编写的,没有使用主要使用html和普通JavaScript的框架。我不知道如何在不使用框架的情况下实现CSRF保护。我可以使用Javascript动态生成一个令牌,并将其作为隐藏元素放置在html表单字段中。但我不知道如何将该令牌发送到flask服务器,以便它能够进行比较。如果不使用模

我有一个我正在编写的单页webapp,它将接受用户名和api键,并执行REST完整api调用。由于用户对其帐户使用apikey,因此无需登录。我没有用乙醚


在后端,我使用一个简单的flask服务器。前端是一个自定义编写的,没有使用主要使用html和普通JavaScript的框架。我不知道如何在不使用框架的情况下实现CSRF保护。我可以使用Javascript动态生成一个令牌,并将其作为隐藏元素放置在html表单字段中。但我不知道如何将该令牌发送到flask服务器,以便它能够进行比较。如果不使用模板引擎,我怎么能做到这一点呢?

首先,您需要从服务器生成csrf令牌,客户端可以通过一个简单的请求获得它,然后在post请求中传递回它。您可以使用下面的方法来生成令牌

flask_wtf.csrf.generate_csrf(secret_key=None, time_limit=None)
比如说,

@app.route('/token')

def token():

    token=generate_csrf(time_limit=10)

    return jsonify({'token':token}), 201

然后使用标题“X-CSRFToken”发布请求

,因为它使用API密钥,我不确定您为什么需要CSRF保护。我的印象是html表单可以被利用,信息可以重定向(例如API密钥)。在我的情况下,没有CSRF令牌这可能吗?但是你不应该在表单字段中设置API键。啊…我想我明白了。我应该用JS获取具有API键值的元素,手动序列化并在帖子中发送它吗?这回到了最初的问题…html是表单,因为我没有使用模板系统而没有生成。这是一个静态页面。如何保护你的应用程序免受跨站点请求伪造?在执行恶意请求之前,有人可能会先点击您的/令牌路由,获取令牌并将其注入到自己的请求中。这样生成令牌有什么好处?@bRo你是说攻击者可以在自己的浏览器中访问令牌路由吗?是的,但他们将获得自己的令牌,该令牌与受害者的令牌不匹配,因此跨站点请求将被拒绝。如果您的意思是他们可以向令牌端点发出跨站点请求,那么可以,但同源策略意味着他们无法读取令牌。这与将令牌作为表单上的隐藏输入没有什么不同——攻击者可以在自己的浏览器中访问表单页面并获取令牌,但与受害者的令牌不匹配。攻击者可以向表单页面发出跨站点请求,但无法读取令牌。