1.Talisman是一个小型Flask扩展,可处理设置HTTP标头,有助于防止一些常见的Web应用程序安全问题。
默认配置:
https
除非在启用调试的情况下运行,否则强制所有连接。- 启用HTTP严格传输安全性。
- 将Flask的会话cookie设置为
secure
,因此如果您通过非安全连接以某种方式访问应用程序,则永远不会设置它。- 将Flask的会话cookie设置为
httponly
阻止JavaScript访问其内容。CSRF通过Ajax使用单独的cookie,应该不受影响。- 设置 X框选项 ,以
SAMEORIGIN
避免 点击劫持。- 设置X-XSS-Protection以启用IE / Chrome的跨站点脚本过滤器。
- 设置X-Content-Type-Options以防止IE> = 9的内容类型嗅探。
- 设置X-Download-Options以防止IE> = 8打开文件下载。
- 设置一个严格的内容安全策略 的
default-src: 'self'
。这旨在几乎完全防止跨站点脚本(XSS)攻击。这可能是您应该合理改变的唯一设置。请参阅 内容安全策略部分。- 设置一个严格的推荐人,政策 的
strict-origin-when-cross-origin
管辖,其引用的信息应包含的请求。
除了Talisman之外,您应该始终使用跨站点请求伪造(CSRF)库。强烈建议使用 基于Django优秀库的Flask-SeaSurf。
2.下载安装:
pip install flask-talisman
安装完成后,将Flask应用程序包装为Talisman:
from flask import Flask
from flask_talisman import Talisman
app = Flask(__name__)
Talisman(app)
3.选项:
*
feature_policy
,默认{}
,请参阅“功能政策”部分。*
force_https
,defaultTrue
,强制所有非调试连接https
。*
force_https_permanent
,默认情况下False
,使用301
的,而不是302
对https
重定向。*
frame_options
,默认情况下SAMEORIGIN
,可以是SAMEORIGIN
,DENY
或ALLOWFROM
。1.DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
2.SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
3.ALLOW-FROM:表示该页面可以在指定来源的 frame 中展示。
4.换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。*
frame_options_allow_from
,defaultNone
,一个字符串,表示允许通过iframe嵌入网站的域。*
strict_transport_security
,默认True
,是否发送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'
,请参阅“ 内容安全策略”部分。*
content_security_policy_nonce_in
,默认[]
。添加每请求的随机数.对于flask请求对象以及指定的CSP头部分的值。即['script-src','style-src']*
content_security_policy_report_only
,默认情况下False
,是否将CSP标头设置为“仅报告”(作为Content-Security-Policy-Report-Only)以通过禁用浏览器的策略实施来简化部署,需要使用content_security_policy_report_uri
参数传递值*
content_security_policy_report_uri
,defaultNone
,一个字符串,指示用于CSP违规报告的报告URI*
referrer_policy
,defaultstrict-origin-when-cross-origin
,一个字符串,用于将Referrer Policy标头设置为在执行同源请求时发送完整URL,仅将文档的来源发送到同等安全的目标(HTTPS-> HTTPS),并且不向较少的目标发送标头安全目标(HTTPS-> HTTP)。*
session_cookie_secure
,默认情况下True
,将会secure
话cookie设置为,以防止它通过普通发送http
。*
session_cookie_http_only
,默认情况下True
,将会httponly
话cookie设置为,以防止它被JavaScript读取。*
force_file_save
,默认情况下False
,是否将X-Download-Options
标题设置noopen
为阻止IE> = 8直接打开文件下载并仅保存它们
4.内容安全政策
默认内容安全策略非常严格,将阻止加载与应用程序不在同一域中的任何资源。大多数Web应用程序都需要更改此策略。
可以使用稍微宽松的策略 flask_talisman.GOOGLE_CSP_POLICY
,允许从YouTube和地图加载Google托管的JS库,字体和嵌入媒体。
您可以而且应该创建自己的政策以满足您网站的需求。以下是一些改编自MDN的例子 :
例1
这是默认策略。网站管理员希望所有内容都来自网站自己的来源(这不包括子域名。)
csp = {
'default-src': '\'self\''
}
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
; 使用示例CSP,此站点使用default-src
指令指定的设置,这意味着只能从源服务器加载脚本。
例6
网站管理员希望允许嵌入式脚本(可能是动态生成的)。
csp = {
'default-src': '\'self\'',
'script-src': '\'self\'',
}
talisman = Talisman(
app,
content_security_policy=csp,
content_security_policy_nonce_in=['script-src']
)
需要将随机数添加到模板中的脚本标记中:
< script nonce = “ {{csp_nonce()}} ” >
// ...
< / script >
请注意,需要明确定义应添加nonce -...源的CSP指令(示例中的script-src)。
5.功能政策
默认功能策略为空,因为这是默认的预期行为。请注意,功能政策仍然是草案https://wicg.github.io/feature-policy/, 并在Chrome和Safari中受支持。
地理位置示例
禁用对Geolocation接口的访问。
feature_policy = {
'geolocation': '\'none\''
}
talisman = Talisman(app, feature_policy=feature_policy)
GitHub地址:https://github.com/GoogleCloudPlatform/flask-talisman
网友评论