2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅《关于》页面了解有关此工作的更多信息。

0
Transducers

在transducers中使用关键字作为哨兵值可能会在极少数情况下使某些应用程序暴露于bug和潜在的安全风险。

(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

感谢提高我的权限,Alex。

我本意不是想把布丁做得太多,但也许最终还是做过了!:-)

我的想法是,如果你正在使用转换器来映射/归约用户输入获取的值,那么攻击者可能导致循环早于预期中断;这可能会导致其他后果。我没有具体的攻击向量,但我见过sentinel ::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报告)
...