Moat

Moat

一个用于你的 Vapor 应用的防御线,包括攻击过滤+ 额外功能

为何使用它?

Moat 提供中间件、自定义 Leaf 标签和字符串扩展,用于检查和阻止基于来源和引用页眉的请求,过滤 src 和 href 属性的 XSS 攻击,保护未编码的 HTML 免受深奥的 XSS 技术攻击,审查不雅用语,并允许纯粹未经更改的 HTML。

Moat 应该与其他保护措施(如 CSRF 令牌和强大的内容安全策略 (CSP) 策略)一起使用。CSP 策略向浏览器发出指令,指示可以从包含 CSP 页眉的页面加载哪些资源以及从何处加载。请参阅 vapor-community/CSRFbrokenhandsio/VaporSecurityHeaders 库,以便为您的 Vapor 应用程序添加 CSRF 令牌和安全页眉。

有关 Vapor 应用程序安全性的更多信息,请访问 Broken Hands 的 Security And Your Vapor Application 文章。

过滤器将定期更新,以防御最新的攻击。

设置

将 Moat 添加到您的 Package.swift

dependencies: [
    ...,
   .package(url: "https://github.com/vapor-community/moat.git", from: "0.0.6")
]

跨站请求伪造 (CSRF) 过滤器

OriginCheckMiddleware

OriginCheckMiddleware 通过检查传入的 Origin 和/或 Referer 页眉,并阻止来自未列入批准来源列表或引用页面的 POST 请求,来帮助防御跨站请求伪造 (CSRF) 攻击。Origin 和/或 referer 页眉可能并非在所有请求中都存在。您可以选择在省略 origin 或 referrer 页眉时“fail open”(允许通过),以平衡安全性和功能性;或者如果需要更高的安全级别和/或您的应用程序中未实施其他 CSRF 缓解措施,则选择 “fail close”(拒绝通过)。

用法
  1. 将 origin 和 referer 设置为预期的来源和引用页。
    • Origin 示例:origin: "https://www.example.com"
    • Referer 示例:referer: "https://www.example.com/" (/ 很重要)
  2. 决定在页眉不存在时是 failopen 还是 failclosed
    • 示例: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("...")

跨站脚本 (XSS) 过滤器

Src/Href

保护 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)

XSS

为原始 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/Href
XSS
不雅用语
¯\(ツ)/¯ (耸肩)
将 Leaf 标签添加到您的 configure.swift
    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 包含可自定义的过滤器列表:ProtanityFilterXSSFilterSrcFilterHtmlEncodeFilter。它们各自包含一个数组 (filterArray) 和一个字典 (filterDict)。数组中的项目将在过滤时被删除,而字典的键将被替换为其对应的值。

归属

资源