一个用于你的 Vapor 应用的防御线,包括攻击过滤+ 额外功能。
Moat 提供中间件、自定义 Leaf 标签和字符串扩展,用于检查和阻止基于来源和引用页眉的请求,过滤 src 和 href 属性的 XSS 攻击,保护未编码的 HTML 免受深奥的 XSS 技术攻击,审查不雅用语,并允许纯粹未经更改的 HTML。
Moat 应该与其他保护措施(如 CSRF 令牌和强大的内容安全策略 (CSP) 策略)一起使用。CSP 策略向浏览器发出指令,指示可以从包含 CSP 页眉的页面加载哪些资源以及从何处加载。请参阅 vapor-community/CSRF 和 brokenhandsio/VaporSecurityHeaders 库,以便为您的 Vapor 应用程序添加 CSRF 令牌和安全页眉。
有关 Vapor 应用程序安全性的更多信息,请访问 Broken Hands 的 Security And Your Vapor Application 文章。
过滤器将定期更新,以防御最新的攻击。
dependencies: [
...,
.package(url: "https://github.com/vapor-community/moat.git", from: "0.0.6")
]
OriginCheckMiddleware 通过检查传入的 Origin 和/或 Referer 页眉,并阻止来自未列入批准来源列表或引用页面的 POST 请求,来帮助防御跨站请求伪造 (CSRF) 攻击。Origin 和/或 referer 页眉可能并非在所有请求中都存在。您可以选择在省略 origin 或 referrer 页眉时“fail open”(允许通过),以平衡安全性和功能性;或者如果需要更高的安全级别和/或您的应用程序中未实施其他 CSRF 缓解措施,则选择 “fail close”(拒绝通过)。
origin: "https://www.example.com"
referer: "https://www.example.com/"
(/ 很重要)failopen: True
其他选项
- 将状态设置为 HTTPResponseStatus
- 将原因设置为错误字符串
选项
- origin: [String] 或 String
- referer: [String] 或 String
- failopen: Bool (默认 = True)
- status: HTTPResponseStatus (默认 = .badRequest)
- reason: String (默认 = "Origin 检查失败。")
如果您想在所有 POST 请求上使用过滤,请在您的 configure.swift 文件中设置 OriginCheckMiddleware。
var middlewareConfig = MiddlewareConfig()
let origins = ["https://www.example1.com", "https://www.example2.com"]
let refers = ["https://www.example1.com/", "https://www.example2.com/"]
middlewareConfig.use(OriginCheckMiddleware(origin: origins, referer: refers, failopen: true))
services.register(middlewareConfig)
如果您想将中间件应用于某些路由,则可以使用路由组。
let origin = "https://www.example1.com"
let referer = "https://www.example1.com/"
let moat = router.grouped(OriginCheckMiddleware(origin: origin, referer: referer))
moat.post("...")
保护 src 或 href 属性免受 XSS 攻击。例如,有效负载 javascript:alert('Vapor')
或 data:text/html;base64,PHNjcmlwdD5hbGVydCgnVmFwb3InKTwvc2NyaXB0Pg==
未通过模板引擎或 HTML 编码进行转义。当嵌入到 src、href 或 data 属性中时,应保护这些属性 (<a href=“javascript:alert('Vapor')”>XSS</a>
)。例如,javascript:alert(1)
变为不可利用的 javascriptalert(1)
。
为原始 HTML 字符串提供 XSS 保护,无论是通过自定义 Leaf 标签还是字符串。例如,<img src=x onerror="alert(1)">
变为安全的 <img src=x ="alert(1)">
注意:并非所有 XSS 攻击都被缓解,因为内容未进行 HTML 转义。
提供可自定义的数组来审查单词,或提供字典来用替代词替换单词。例如,将 fudge
变为 *****
或将 damn
变为 dang
。
允许将原始的、未转义的、未过滤的和未受保护的 HTML 传递给 Leaf。例如,XSS 漏洞 <script>alert(1)</script>
是不受保护的,并且未进行 HTML 编码或过滤。
#src(string)
或 #href(string)
#html(string)
string.xssFilter()
#clean(string)
string.profanityFilter()
#shrug(string)
var tags = LeafTagConfig.default()
tags.use(ProfanityTag(), as: "clean")
tags.use(SrcTag(), as: "src")
tags.use(SrcTag(), as: "href")
tags.use(HtmlTag(), as: "html")
tags.use(ShrugTag(), as: "shrug") // ¯\_(ツ)_/¯
services.register(tags)
Filter.swift 包含可自定义的过滤器列表:ProtanityFilter
、XSSFilter
、SrcFilter
和 HtmlEncodeFilter
。它们各自包含一个数组 (filterArray
) 和一个字典 (filterDict
)。数组中的项目将在过滤时被删除,而字典的键将被替换为其对应的值。