为Flask提供HTTP安全头部。
项目描述
Talisman是一个小的Flask扩展,用于设置HTTP头部,有助于防止一些常见的Web应用程序安全问题。
默认配置
强制所有连接到https,除非启用调试模式。
启用HTTP严格传输安全。
将Flask的会话cookie设置为secure,因此如果您的应用程序通过非安全连接访问,它将永远不会被设置。
将 Flask 的会话 cookie 设置为 httponly,防止 JavaScript 访问其内容。通过 Ajax 的 CSRF 使用单独的 cookie,应不受影响。
将 Flask 的会话 cookie 设置为 Lax,防止 CSRF 易受攻击的请求方法中 cookie 泄露。
将 X-Frame-Options 设置为 SAMEORIGIN 以防止 clickjacking。
将 X-Content-Type-Options 设置为防止内容类型嗅探。
设置严格的 内容安全策略 为 default-src: 'self', 'object-src': 'none'。这旨在几乎完全防止跨站脚本(XSS)攻击。这可能是在合理范围内你应该更改的唯一设置。请参阅 内容安全策略 部分。
设置严格的 Referrer-Policy 为 strict-origin-when-cross-origin 以控制哪些引用信息应包含在发出的请求中。
默认禁用 Permissions-Policy 中的 browsing-topics,例如在 Drupal 中,以增强隐私保护。
除了 Talisman 之外,你还应该始终使用跨站请求伪造(CSRF)库。强烈建议使用基于 Django 优秀库的 Flask-SeaSurf。
安装 & 基本用法
通过 pip 安装
pip install flask-talisman
安装后,使用 Talisman 包装你的 Flask 应用程序
from flask import Flask
from flask_talisman import Talisman
app = Flask(__name__)
Talisman(app)
还有一个完整的 示例应用程序。
选项
force_https,默认 True,强制所有非调试连接到 https(关于 HTTPS)。
force_https_permanent,默认 False,使用 301 而不是 302 进行 https 重定向。
frame_options,默认 SAMEORIGIN,可以是 SAMEORIGIN、DENY 或 ALLOWFROM(关于 Frame Options)。
frame_options_allow_from,默认 None,一个表示允许通过 iframe 嵌入站点的域的字符串。
strict_transport_security,默认 True,是否发送 HSTS 头(关于 HSTS)。
strict_transport_security_preload,默认 False,启用 HSTS 预加载。如果您将应用程序注册到 Google 的 HSTS 预加载列表,Firefox 和 Chrome 将永远不会通过非安全连接加载您的网站。
strict_transport_security_max_age,默认 ONE_YEAR_IN_SECS,浏览器将尊重 HSTS 头的时间长度。
strict_transport_security_include_subdomains,默认 True,是否子域也应使用 HSTS。
内容安全策略 (content_security_policy),默认 default-src: 'self'`, 'object-src': 'none',请参阅 内容安全策略 部分(关于内容安全策略)。
内容安全策略非授权值 (content_security_policy_nonce_in),默认 []。为每个请求添加非授权值到 Flask 请求对象,并将其添加到指定的 CSP 头部部分。例如 ['script-src', 'style-src']
内容安全策略仅报告 (content_security_policy_report_only),默认 False,是否将 CSP 头部设置为“仅报告”以简化部署,通过禁用浏览器强制执行策略,需要传递包含 content_security_policy_report_uri 参数的值。
内容安全策略报告URI (content_security_policy_report_uri),默认 None,一个字符串,指示用于 CSP 违规报告 的报告 URI。
来源策略 (referrer_policy),默认 strict-origin-when-cross-origin,一个字符串,用于设置 Referrer Policy 头部,在执行同源请求时发送完整 URL,只向同等安全的目的地发送文档的来源(HTTPS->HTTPS),并向不太安全的目的地发送无头部信息(HTTPS->HTTP)(关于来源策略)。
权限策略 (permissions_policy),默认 {'browsing-topics': '()'},请参阅 权限策略 部分(关于权限策略)。
会话cookie安全 (session_cookie_secure),默认 True,将会话 cookie 设置为 secure,防止通过普通 http 发送(关于 cookie(https://mdn.org.cn/en-US/docs/Web/HTTP/Headers/Set-Cookie))。
会话cookie仅http (session_cookie_http_only),默认 True,将会话 cookie 设置为 httponly,防止 JavaScript 读取。
会话cookie同源 (session_cookie_samesite),默认 Lax,将其设置为 Strict 以防止浏览器在所有跨站浏览上下文中将 cookie 发送到目标站点,即使是在跟随常规链接时。
强制文件保存 (force_file_save),默认 False,是否将 X-Download-Options 头部设置为 noopen 以防止 IE >= 8 直接打开文件下载并仅保存。
X-内容类型选项 (x_content_type_options),默认 True,防止 MIME 嗅探漏洞(关于内容类型选项)。
X-XSS保护 (x_xss_protection),默认 False,防止跨站脚本(XSS)攻击(关于 XSS 保护)。此选项默认禁用,因为没有现代浏览器(支持此头部)。
有关(安全)头部的完整列表,请参阅:https://mdn.org.cn/en-US/docs/Web/HTTP/Headers。
视图选项
有时您可能需要针对特定视图更改策略。以下选项可以按视图进行更改:force_https、frame_options、frame_options_allow_from、content_security_policy、feature_policy、permissions_policy 和 document_policy。
from flask import Flask
from flask_talisman import Talisman, ALLOW_FROM
app = Flask(__name__)
talisman = Talisman(app)
@app.route('/normal')
def normal():
return 'Normal'
@app.route('/embeddable')
@talisman(frame_options=ALLOW_FROM, frame_options_allow_from='*')
def embeddable():
return 'Embeddable'
内容安全策略
默认内容安全策略非常严格,将阻止加载与应用程序不在同一域中的任何资源。大多数Web应用程序都需要更改此策略。如果您尚未准备好部署内容安全策略,可以将 content_security_policy 设置为 False 以完全禁用发送此头信息。
在 flask_talisman.GOOGLE_CSP_POLICY 提供了一个稍微宽松的策略,允许加载Google托管的JS库、字体,并从YouTube和地图嵌入媒体。
您可以根据网站需求创建自己的策略。以下是一些来自 MDN 的示例。
示例 1
这是默认策略。网站管理员希望所有内容都来自网站的自身源(这排除了子域名)并禁止使用旧版HTML元素。
csp = {
'default-src': '\'self\'',
'object-src': '\'none\'',
}
talisman = Talisman(app, content_security_policy=csp)
示例 2
网站管理员希望允许来自受信任域及其所有子域的内容(不需要与CSP设置的域相同)。
csp = {
'default-src': [
'\'self\'',
'*.trusted.com'
]
}
示例 3
网站管理员希望允许Web应用程序的用户在其自己的内容中包含来自任何源的照片,但将音频或视频媒体限制在受信任的提供者,并将所有脚本仅限于托管受信任代码的特定服务器。
csp = {
'default-src': '\'self\'',
'img-src': '*',
'media-src': [
'media1.com',
'media2.com',
],
'script-src': 'userscripts.example.com'
}
在此示例中,内容仅允许来自文档的源,但有以下例外
可以从任何地方加载照片(注意星号通配符)。
仅允许从 media1.com 和 media2.com 加载媒体(不包括这些网站的子域名)。
仅允许从 userscripts.example.com 加载可执行脚本。
示例 4
在线银行网站的网站管理员希望确保所有内容都使用SSL加载,以防止攻击者窃听请求。
csp = {
'default-src': 'https://onlinebanking.jumbobank.com'
}
服务器仅允许通过单一源 onlinebanking.jumbobank.com 加载特定的通过HTTPS加载的文档。
示例 5
Web邮件网站的网站管理员希望允许在电子邮件中使用HTML,以及从任何地方加载的照片,但不允许JavaScript或其他可能危险的内容。
csp = {
'default-src': [
'\'self\'',
'*.mailsite.com',
],
'img-src': '*'
}
注意,此示例未指定 script-src;在此示例的内容安全策略中,该网站使用 default-src 指令中指定的设置,这意味着脚本只能从源服务器加载。
示例 6
网站管理员希望允许嵌入脚本(这些脚本可能是动态生成的)。
csp = {
'default-src': '\'self\'',
'script-src': '\'self\'',
}
talisman = Talisman(
app,
content_security_policy=csp,
content_security_policy_nonce_in=['script-src']
)
需要在模板中的脚本标签中添加 nonce。
<script nonce="{{ csp_nonce() }}">
//...
</script>
注意,需要明确定义添加 nonce-… 源的 CSP 指令(例如示例中的 script-src)。
示例 7
网站管理员希望通过不支持指定策略为Python字典的环境变量覆盖CSP指令,例如:
export CSP_DIRECTIVES="default-src 'self'; image-src *"
python app.py
然后在应用代码中,您可以从环境中读取CSP指令:
import os
from flask_talisman import Talisman, DEFAULT_CSP_POLICY
talisman = Talisman(
app,
content_security_policy=os.environ.get("CSP_DIRECTIVES", DEFAULT_CSP_POLICY),
)
如上所示,策略可以像官方规范要求设置HTTP头信息一样简单地定义:作为由分号分隔的单独CSP指令列表。
功能策略
注意:在最新草案中,功能策略已被大量重命名为权限策略,一些功能可能会转移到文档策略。在本稿撰写时,大多数浏览器支持Feature-Policy HTTP头名称。如果您想设置这些,请参阅下面的权限策略和文档策略部分。
此外,在重命名之前,功能策略规范并未超出草稿阶段,但在大多数浏览器中以某种形式得到了支持。
默认功能策略为空,因为这默认是期望的行为。
地理位置示例
禁用对地理位置接口的访问。
feature_policy = {
'geolocation': '\'none\''
}
talisman = Talisman(app, feature_policy=feature_policy)
权限策略
功能策略已拆分为权限策略和文档策略,但本稿撰写时,权限策略在浏览器中的支持非常有限,建议仍然设置Feature-Policy HTTP头。当权限策略得到更广泛支持时,Talisman将包含权限策略支持。
请注意,权限策略仍然是工作草案。
当在功能策略和权限策略中设置相同的功能或权限时,在支持两种策略的浏览器中,权限策略的设置将具有优先权。
应注意,功能策略和权限策略的语法不同,如提供的地理位置示例所示。
默认权限策略为browsing-topics=(),这选择站点退出基于兴趣的广告活动联邦学习群体的API。
权限策略可以使用字典或字符串进行设置。
地理位置和麦克风示例
使用字典语法禁用对地理位置接口和麦克风的访问
permissions_policy = {
'geolocation': '()',
'microphone': '()'
}
talisman = Talisman(app, permissions_policy=permissions_policy)
使用字符串语法禁用对地理位置接口和麦克风的访问
permissions_policy = 'geolocation=(), microphone=()'
talisman = Talisman(app, permissions_policy=permissions_policy)
文档策略
功能策略已拆分为权限策略和文档策略,但本稿撰写时,文档策略在浏览器中的支持非常有限,建议仍然设置Feature-Policy HTTP头。当文档策略得到更广泛支持时,Talisman将包含文档策略支持。
请注意,文档策略仍然是非官方草案。
默认文档策略为空,因为这默认是期望的行为。
文档策略可以使用字典或字符串进行设置。
大尺寸图片示例
使用字典语法禁止大尺寸图片
document_policy = {
'oversized-images': '?0'
}
talisman = Talisman(app, document_policy=document_policy)
使用字符串语法禁止大尺寸图片
document_policy = 'oversized-images=?0'
talisman = Talisman(app, document_policy=document_policy)
免责声明
此代码最初来自Google,但不是官方Google产品,无论是实验性的还是其他类型的。它于2021年6月6日从未维护的GoogleCloudPlatform/flask-talisman分支。
网络应用程序安全没有万能药。Talisman可以帮助,但安全不仅仅是设置几个头部。任何面向公众的Web应用程序都应采取综合的安全方法。
贡献更改
许可
Apache 2.0 - 请参阅LICENSE
项目详细信息
flask-talisman-1.1.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | c5f486f5f54420729f84b3c3850cd63f96e8b033a9629bee66c524ea363797ff |
|
MD5 | cb2d73108c81bc6e9687843055f97905 |
|
BLAKE2b-256 | 385c157d51e32eaffdb34ee316261239937d66400a57cd8146176fd8ce50c43a |
flask_talisman-1.1.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3c42b610ebe49b0e35ca150e179bf51aa1da01e4635b49a674868ea681046208 |
|
MD5 | 0e3b0af81149d9d0118e86b91bddc706 |
|
BLAKE2b-256 | 771ca15ac936dc3ae4491c5ff089dccdccd72cd3608b15fcf4e2de961f9ee8f3 |