Enable HTTP Compression Facilities

预计阅读时间:4分钟

压缩功能增加了使用gzip,deflate或自定义编码器压缩传出内容的能力,从而减小了响应的大小.

install(Compression)
此功能在io.ktor.features.Compression类中io.ktor.features.Compression ,不需要其他工件.

Configuration

当省略配置块时,将使用默认配置. 它包括以下编码器:

  • gzip
  • deflate
  • identity

如果要选择特定的编码器,则需要提供一个配置块:

install(Compression) {
    gzip()
}

可以为每个编码器配置优先级和一些条件:

install(Compression) {
    gzip {
        priority = 1.0
    }
    deflate {
        priority = 10.0 
        minimumSize(1024) // condition
    }
}

编码器按照HTTP请求中Accept-Encoding标头中的指定质量进行排序,然后按指定的优先级进行排序. 满足所有条件的第一个编码器获胜.

在上面的示例中,当Accept-Encoding没有指定质量时,将为所有小于1K的内容选择gzip ,所有其余内容将使用deflate编码器进行编码.

一些典型条件很容易获得:

  • minimumSize –压缩响应的最小大小
  • matchContentType –一种或多种应压缩的内容类型
  • excludeContentType –不压缩这些内容类型

您还可以通过提供谓词来使用自定义条件:

gzip {
    condition {
        parameters["e"] == "1"
    }
}

Security with HTTPS

具有任何压缩方式的HTTPS都容易受到BREACH攻击. 这种攻击允许恶意攻击者在不到一分钟的时间内从加密的HTTPS页面中猜测秘密(例如会话,身份验证令牌,密码或信用卡).

您可以通过以下方法减轻这种攻击:

  • 完全关闭HTTP压缩(这可能会影响性能).
  • 不要将用户输入(GET,POST或Header / Cookies参数)作为与机密(包括带有session_id的Set-Cookie )混合的响应(Header或Bodies)作为响应的一部分.
  • 例如在html页面中向输出添加随机的字节数,您可以仅添加<!-- 100~500 random_bytes !--> ,这使得在合理的时间内更难猜测攻击者的秘密.
  • 确保您的网站完全HTTPS并启用了HSTS ,并添加一个有条件的标头来检查Referrer页面. (如果只有一个页面没有HTTPS,则恶意攻击者可以使用该页面使用与Referrer相同的域来注入代码).
  • 在页面上添加CSRF保护.
application.install(Compression) {
    gzip {
        condition {
            // @TODO: Check: this is only effective if your website is completely HTTPS and has HSTS enabled. 
            request.headers[HttpHeaders.Referrer]?.startsWith("https://my.domain/") == true
        }
    }
}

TL; DR; 即使HTTPS阻止窃听者知道请求的内容,它也不会隐藏响应长度. 因此,您的一个用户可能正在连接到恶意访问点,例如,通过连接到公共网络或具有众所周知密码的用户,或具有Evil Twin的专用网络. 该访问点可以拦截所有加密的消息并测量长度. 然后可以修改任何非https连接(或由社会工程师用户访问受攻击者控制的https页面)以注入JavaScript或放置指向易受攻击页面的图像,从而使反映出的输入(获取,发布或标头参数)发生变化在标头或响应主体中,访问点可以测量响应的长度,以猜测只有100至10000个请求的秘密,而这些请求是由浏览器使用JavaScript或图像请求强制执行的,而没有用户曾经注意到.

Extensibility

您可以通过实现CompressionEncoder接口并提供配置功能来提供自己的编码器. 由于内容可以作为ReadChannelWriteChannel ,因此它应该能够以两种方式进行压缩. 请参阅GzipEncoder作为编码器的示例.

by  ICOPY.SITE