请在 Clojure 2024 年度调查 中分享您的看法!

欢迎!请查阅 关于页面 以了解更多有关如何使用本站的信息。

0
转换器

将关键字作为哨兵值用于转换器,在罕见情况下可能会使某些应用程序暴露于错误和潜在的安全风险。

(sequence (partition-by keyword) ["1" "none" "2" "clojure.core/none" "3" "4"]) ;(["1"] ["none"] ["2"] ["clojure.core/none" "3"] ["4"])

理想情况下,应该使用一个私有的或局部的值,该值不能注入到函数域中,例如 {{(Object.)}}。

5 条回答

0

评论作者:rickmoynihan

为打乱示例的格式表示歉意,我也没有打算将其标记为重要。虽然我似乎无法编辑它,也许其他人可以。

0

评论作者:rickmoynihan

也要感谢 @reborg 和 @bronsa 在 #clojure-uk 上分享上述片段。

0

评论作者:alexmiller

Rick - 我已添加您到可编辑权限所需的组中。

这如何构成安全风险?

0

评论作者:rickmoynihan

感谢提升我的权限,亚历克斯。

我并不是真的想要把布丁做得过头,但是也许最终我还是做到了!:-)

我的理由是,如果您使用转换器(transducer)来映射/合并从用户输入中获取的值,那么攻击者可能会导致循环提前终止,这可能会带来其他后果。我并没有具体想到攻击向量,但我也看到了“::halt”哨兵,并想象用户可能能够将“clojure.core/halt”注入HTTP头中。如果Ring有将键转换成关键字的中间件,那么您就有用户注入的转换器哨兵值,而这个哨兵值可能会被用来跳过其他字段的验证/编码/转义等。

然而,我更仔细地研究了`{{halt-when}}`和其他转换器的实现,这似乎关键值永远不会与用户数据混合;并且`::none`被用于表示某些转换器函数的第一次遍历。所以看起来我弄错了。现在我觉得这个问题不值得解决。

0
参考:[https://clojure.atlassian.net/browse/CLJ-2312](https://clojure.atlassian.net/browse/CLJ-2312)(由rickmoynihan报告)
...