跳转到主要内容

Flask的HTTP安全头部。

项目描述

Build Status Coverage Status PyPI Version

Talisman是一个小巧的Flask扩展,用于设置HTTP头部,可以帮助防止一些常见的Web应用安全漏洞。

默认配置

  • 强制所有连接到https,除非启用调试模式。

  • 启用HTTP严格传输安全

  • 启用HSTS预加载。如果您将您的应用程序注册到Google的HSTS预加载列表,Firefox和Chrome将永远不会通过非安全连接加载您的网站。

  • 将Flask的会话cookie设置为< span class="docutils literal">secure,因此如果您的应用程序通过非安全连接访问,则永远不会设置。

  • 将Flask的会话cookie设置为< span class="docutils literal">httponly,防止JavaScript访问其内容。通过Ajax进行的CSRF使用单独的cookie,不应受到影响。

  • X-Frame-Options设置为< span class="docutils literal">SAMEORIGIN,以避免clickjacking

  • 设置严格的内容安全策略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,可以是SAMEORIGINDENYALLOWFROM

  • 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 class="docutils literal">frame_options_allow_from和< span class="docutils literal">content_security_policy选项。

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应用程序都应该采取全面的安全方法。

贡献更改

许可

项目详细信息


下载文件

下载适合您平台的应用程序。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

talisman-0.1.0.tar.gz (10.1 kB 查看散列)

上传时间

构建分布

talisman-0.1.0-py2.py3-none-any.whl (13.2 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面