Flask的HTTP安全头部。
项目描述
Talisman是一个小巧的Flask扩展,用于设置HTTP头部,可以帮助防止一些常见的Web应用安全漏洞。
默认配置
强制所有连接到https,除非启用调试模式。
启用HTTP严格传输安全。
启用HSTS预加载。如果您将您的应用程序注册到Google的HSTS预加载列表,Firefox和Chrome将永远不会通过非安全连接加载您的网站。
将Flask的会话cookie设置为< span class="docutils literal">secure span>,因此如果您的应用程序通过非安全连接访问,则永远不会设置。
将Flask的会话cookie设置为< span class="docutils literal">httponly span>,防止JavaScript访问其内容。通过Ajax进行的CSRF使用单独的cookie,不应受到影响。
将X-Frame-Options设置为< span class="docutils literal">SAMEORIGIN span>,以避免clickjacking a>。
设置严格的内容安全策略为default-src: 'self'。这是为了几乎完全防止跨站脚本(XSS)攻击。这可能是您唯一应该合理更改的设置。请参阅下面的部分以配置此设置。
除了Talisman之外,您还应该始终使用跨站请求伪造(CSRF)库。我强烈推荐基于Django优秀库的Flask-SeaSurf。
安装和基本用法
通过pip安装
pip install talisman
from flask import Flask
from talisman import Talisman
app = Flask(__name__)
Talisman(app)
还有一个完整的示例应用程序。
选项
force_https,默认值True,强制所有非调试连接到https。
force_https_permanent,默认值False,使用301而不是302进行https重定向。
frame_options,默认值SAMEORIGIN,可以是SAMEORIGIN、DENY或ALLOWFROM。
frame_options_allow_from,默认值None,是一个字符串,表示允许通过iframe嵌入站点的域名。
strict_transport_security,默认值True,是否发送HSTS标头。
strict_transport_security_max_age,默认值ONE_YEAR_IN_SECS,浏览器将尊重HSTS标头的时间长度。
strict_transport_security_include_subdomains,默认值True,子域是否也应使用HSTS。
content_security_policy,默认值default-src: 'self',请参阅下面的部分。
session_cookie_secure,默认值True,将会话cookie设置为secure,防止它通过纯http发送。
session_cookie_http_only,默认值True,将会话cookie设置为httponly,防止它被JavaScript读取。
每个视图选项
有时您想为特定视图更改策略。可以在每个视图的基础上更改< span class="docutils literal">frame_options span>、< span class="docutils literal">frame_options_allow_from span>和< span class="docutils literal">content_security_policy span>选项。
from flask import Flask
from 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'
内容安全策略
默认内容安全策略非常严格,将阻止加载与应用程序不在同一域的资源。
在talisman.GOOGLE_CSP_POLICY中可使用稍微更宽容的策略,允许加载Google托管JS库、字体以及从YouTube和地图中嵌入媒体。
您可以根据网站需求创建自己的策略。以下是一些来自 MDN 的示例。
示例 1
这是默认策略。网站管理员希望所有内容都来自网站的自身域(这排除了子域。)
csp = {
'default-src': '\'self\''
}
示例 2
网站管理员希望允许来自受信任域及其所有子域的内容(不一定要是CSP设置的域。)
csp = {
'default-src': [
'\'self\'',
'*.trusted.com'
]
}
示例 3
网站管理员希望允许Web应用程序的用户在自己的内容中包含来自任何来源的图像,但将音频或视频媒体限制为受信任的提供商,并将所有脚本仅限制在托管受信任代码的特定服务器上。
csp = {
'default-src': '\'self\'',
'image-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'
}
服务器仅允许通过 HTTPS 通过单一来源 onlinebanking.jumbobank.com 加载文档。
示例 5
一个Web邮件网站的网站管理员希望允许在电子邮件中使用HTML,以及从任何地方加载的图像,但不允许JavaScript或其他可能危险的内容。
csp = {
'default-src': [
'\'self\'',
'*.mailsite.com',
],
'img-src': '*'
}
请注意,此示例没有指定 script-src;使用此示例CSP,此网站使用 default-src 指令指定的设置,这意味着脚本只能从原始服务器加载。
免责声明
这不是一个官方的Google产品,无论是实验性的还是其他类型的。
没有一劳永逸的Web应用程序安全解决方案。Talisman可以帮助,但安全不仅仅是一设置几个头部。任何面向公众的Web应用程序都应该采取全面的安全方法。
贡献更改
请参阅 CONTRIBUTING.md
许可
Apache 2.0 - 请参阅 LICENSE
项目详细信息
下载文件
下载适合您平台的应用程序。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分布
talisman-0.1.0.tar.gz 的散列
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bd394d0f2d7926a838acaa066457c20878e31f2aaf539f5c5529ded1887b3fa8 |
|
MD5 | a6c0a401ee46d8fb603a9b7c3f571313 |
|
BLAKE2b-256 | 28369e956917b35eca994d24f5e1d53444369df8144d4e35bc69aceaa2aeb668 |
talisman-0.1.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0128ea74b31827a67a4d6e0eb842066193c60f4f90675ec3a64850000a3a3402 |
|
MD5 | 32531275bf5d204d71175c60470c6046 |
|
BLAKE2b-256 | 69f91d0d75804f4eb5a6d0f3b9d46f4248f403fa7dc4e72060bda4b0ef65614d |