Flask CSP(Content-Security-Policy)针对跨站脚本等攻击的最佳实践

ref*_*ome 8 jinja2 flask content-security-policy

我是 CSP 新手。我试图通过设置 resp_header 在我的 Flask 应用程序的所有模板中实现 CSP,以保护我的网站免受跨站点脚本攻击。我修改了我的渲染模板:

return render_template('addvideos.html'  form=form, legend = 'Update video : '+ videos.video_name)
Run Code Online (Sandbox Code Playgroud)

    resp = make_response(render_template('addvideos.html', legend = 'Update video : '+ videos.video_name)
)
    resp.headers['Content-Security-Policy'] = "default-src 'self';"
    return resp
Run Code Online (Sandbox Code Playgroud)

我的应用程序中有超过 50 个“render_template”,我必须为每个添加一个响应标头。经过研究,我发现 after_request 可以实现如下所示的效果:

@app.after_request
def add_security_headers(resp):
    resp.headers['Content-Security-Policy']='default-src \'self\''
    return resp
Run Code Online (Sandbox Code Playgroud)

这很可靠吗?如果我直接在 HTML 模板 ( jinja2 ) 中应用 CSP,可能吗?哪个更可靠?

v25*_*v25 12

这很可靠吗?

是的。在装饰器中设置该标头app.after_request会将标头应用于该标头提供的所有路由app

如果我直接在 HTML 模板 ( jinja2 ) 中应用 CSP,可能吗?

这不是模板本身可以完成的事情,您可以像上面那样在 Python 中设置该标头。

哪个更可靠?

虽然前一种方法(通过app.after_request装饰器)有效,但它通常可以由 Python 应用服务器所在的反向代理来处理。如果这不熟悉,请查看部署文档

例如,使用 nginx 作为反向代理,您可以将其放入您的server块中:

add_header Content-Security-Policy "default-src 'self';";
Run Code Online (Sandbox Code Playgroud)

或者,无论响应代码如何都发送标头:

add_header Content-Security-Policy "default-src 'self';" always;
Run Code Online (Sandbox Code Playgroud)

该博客提供了一些关于是否让反向代理处理发送此标头或在 Flask 应用程序中定义它的好建议:

我应该使用 nginx 还是我的应用程序添加 CSP 标头?Content-Security-Policy虽然使用 nginx 添加 CSP 标头当然很容易,但也可以使用服务器端编程语言([Flask]) 添加标头。无论哪种方式都需要权衡。如果您的应用程序的某些部分可能需要不同的 CSP 策略,那么使用您的应用程序编程语言可能会更容易。或者,如果您计划使用CSP nonce等功能,那么Content-Security-Policy从应用程序代码而不是 nginx 中设置要容易得多。

此外,如果您要部署到像 Heroku 这样的平台,该平台在基本配置中直接公开 Gunicorn 应用程序服务器,那么在您的应用程序中设置此标头可能会更容易,除非您打算进一步部署 nginx 构建包。

其他基于云的负载均衡器可能会提供自己的方式来设置这些标头,独立于您的应用程序。

配置反向代理或负载平衡器时,值得一看Mozilla 的 SSL 配置生成器,它支持 nginx、AWS ALB/ELB 等。然后可以使用Qualys SSL 测试来测试服务器。

  • 非常感谢您花时间写这篇文章。它非常有帮助 (2认同)