GoogleAppEngine 标准中的 Jetty 配置

Jetty configuration in GoogleAppEngine Standard

我在 appengine-web.xml 中尝试了 <env-var name="JETTY_PROPERTIES" value="httpConfig.requestCookieCompliance=RFC2965,jetty.httpConfig.responseCookieCompliance=RFC2965"/>,希望 https://cloud.google.com/appengine/docs/flexible/java/dev-jetty9 中的建议也适用于标准环境。没有运气。如何在 Google App Engine Standard 中设置 Jetty 配置?

为 GAE Flexible Environment 引入了环境变量 JETTY_PROPERTIES

旧的 GAE 标准环境不存在它。

根据您的运行时,您可能仍在使用 Jetty 9。3.x,在这种情况下,您尝试设置的那些属性甚至不存在(它们在 Jetty 9.4.9.v20180320 中引入) )

有关 GAE 灵活运行时,请参阅 ...

参见:https://github.com/GoogleCloudPlatform/jetty-runtime

负责读取<env-var>的bash脚本是50-jetty.bash-

https://github.com/GoogleCloudPlatform/jetty-runtime/blob/master/jetty9/src/main/docker/50-jetty.bash#L36-L38

Jetty 代码库中的 Cookie Compliance 行为

⚠️ 不支持 RFC2109,因为它包含太多安全问题。

RFC6265 - 默认行为

世代

(例如:Server-side Set-Cookie 响应 header,或 Client-side Cookie 请求 header)

  • 名称必须有效per RFC2616 token rules(US-ASCII,7 位,不包括 控制字符和分隔符)
  • 值必须有效per RFC6265 value rules(US-ASCII,7位,不包括控制字符,whitespace,DQUOTE"、逗号 ,、分号 ; 和反斜杠 \)
  • 不生成 Version=# 条目
  • 不生成 Comment= 条目
  • 不生成“$”条目(如 $Version$Domain$Port$Version 条目)
  • 生成以下条目
    • Path
    • Domain
    • Expires
    • Max-Age
    • Secure
    • HttpOnly
    • SameSite

正在解析

(例如:Server-side Cookie 请求 header,或 Client-side Set-Cookie 响应 header)

  • 基于行业建议的安全 Cookie 解析行为的宽松解析器 - RFC6265 - 示例解析行为:CookieCutterLenientTest
  • 名称必须有效per RFC2616 token rules(US-ASCII,7 位,不包括 控制字符和分隔符)- 如果失败将拒绝 cookie(意思是Cookie 没有出现在生成的 Cookie 列表中)
  • 值必须有效per RFC6265 value rules(US-ASCII,7位,不包括控制字符,whitespace,DQUOTE"、逗号 ,、分号 ; 和反斜杠 \) - 如果失败将拒绝 cookie
  • 值在解析期间允许使用 DQUOTE,但必须通过在值末尾匹配 DQUOTE 来支持它。 - 如果失败将拒绝 cookie(意味着 Cookie 不会出现在生成的 Cookie 列表中)
  • 忽略“$”命名条目(如 $Version$Domain$Port$Version 条目)
  • 不允许每个 Cookie header 超过 1 个 cookie 声明(从 HTTP/1.0 天开始的古老的“逗号分隔符”方法)

RFC2965 - 替代行为

世代

(例如:Server-side Set-Cookie 响应 header,或 Client-side Cookie 请求 header)

  • 名称必须有效per RFC2109 rules(US-ASCII,7位,不包括控制字符,分隔符,DQUOTE,逗号,semi-colon 、反斜杠、space 和水平制表符)
  • 如果存在分隔符,名称将被 DQUOTE 包围。 (⚠️ 如果此处存在分隔符,大多数现代浏览器将拒绝整个 cookie)
  • 值必须根据 RFC2109 value rules 有效(US-ASCII,7 位,不包括 控制字符、定界符、DQUOTE、逗号、semi-colon、反斜杠、space 和水平制表符)
  • 如果存在分隔符,值将被 DQUOTE 包围。 (⚠️ 如果此处存在分隔符,大多数现代浏览器将拒绝整个 cookie)
  • 不生成“$”条目(如 $Version$Domain$Port$Version 条目)
  • ⚠️ 不生成SameSite条目
  • 生成以下条目
    • Version
    • Path
    • Domain
    • Expires
    • Max-Age
    • Secure
    • HttpOnly
    • Comment

正在解析

(例如:Server-side Cookie 请求 header,或 Client-side Set-Cookie 响应 header)

  • 名称必须有效per RFC2109 token rules(US-ASCII,7 位,不包括 控制字符和分隔符)- 任何违规都会导致不可预知的结果(比如在错误的分隔符处分割 cookie)
  • 值必须有效per RFC6265 value rules(US-ASCII,7位,不包括控制字符,whitespace,DQUOTE"、逗号 ,、分号 ; 和反斜杠 \) - 任何违规行为都会导致不可预知的结果(例如在错误的分隔符处拆分 cookie)
  • 值在解析期间允许使用 DQUOTE,但必须通过在值末尾匹配 DQUOTE 来支持它。 - 任何违规行为都会导致不可预知的结果(比如在错误的分隔符处拆分 cookie)
  • 解析“$”命名条目(如 $Version$Domain$Port$Version 条目)
    • 注意:$Port 在解析后的 Cookie 的注释中报告。
  • Cookie header 允许超过 1 个 cookie 声明(从 HTTP/1.0 天开始的古老的“逗号分隔符”方法)
  • ⚠️不解析SameSite条目