你好,这是一个first-timers-only
问题。这意味着我们一直在努力让那些以前没有为我们的代码库做出过贡献的人,甚至以前没有为开源做出过贡献的人更容易理解。
如果您就是这样,我们有兴趣帮助您迈出第一步,并可以回答您的问题并为您提供帮助。请注意,我们对自由和开源软件中代表性不足的群体的贡献特别感兴趣!
如果您以前曾贡献过,请考虑将这一贡献留给新人,并查看我们的一般ideal-for-contribution
问题。谢谢!
问题
在和Actuator 端点上公开信息时, Actuatororg.springframework.boot.actuate.endpoint.Sanitizer
负责清理敏感信息。env
configprops
当配置键与配置的模式之一匹配时,整个配置值都会被清理。类似 URI 的键 ( ) 有一种特殊情况"uri", "uris", "address", "addresses"
,其中Sanitizer
尝试仅清理 URL 的密码部分:
something.uri=https://emily:springboot@spring.io/ -> something.uri=https://emily:******@spring.io/
other.uri=https://spring.io/ -> other.uri=https://spring.io/
第一个问题是关于文档。该文档暗示所有配置键都以相同的方式处理。
如果要清理的任何键都是 URI 格式(即schema>://<username>:<password>@<host:/),仅对密码部分进行清理。
但实际上用户信息键 ( "uri", "uris", "address", "addresses"
) 和其他键的处理是不同的:
- 用户信息键 (
"uri", "uris", "address", "addresses"
):仅隐藏 URL 中的密码部分,或返回不变的值
- 其他键 (
"password", "secret", "key", "token", "vcap_services", "sun.java.command","credentials"
) 已完全清理
第二个问题是,清理程序用于针对序列化的配置值 - 每当 aList
序列化为 JSON 时,它都会序列化为[https://emily:springboot@spring.io/,https://spring.io]
而不是https://emily:springboot@spring.io/,https://spring.io
。问题是,如果当前URI_USERINFO_PATTERN
不支持这种情况并且返回原始值,则不会清理任何内容。
解决方案
首先,应该改进参考文档(位于spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto.adoc
),以更好地解释密钥的处理方式(有些在所有情况下都经过完全清理,其他的仅包含密码部分(如果存在))。
另外,应该改进URI_USERINFO_PATTERN
中的模式Sanitizer
以支持列表情况。也许类似的东西"\\[?[A-Za-z]+://.+:(.*)@.+$"
会起作用? SanitizerTests 中的所有测试在更改后应该仍然是绿色的,并且我们应该有一个新的测试用例来检查:
"[http://user1:password1@localhost:8080,http://user2@localhost:8082,http://localhost:8083]" -> "[http://user1:******@localhost:8080,http://user2@localhost:8082,http://localhost:8083]";
如果可能,PR 应该针对 2.2.x 分支进行 - 如果 master 对贡献者来说更方便,项目维护者将 rebase PR。