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

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

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

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

我并不想做得太多,但我可能最终还是那样做了!:-)

我的推理是,如果你使用传输器来映射/汇总从用户输入中获取的值,那么攻击者可能会使循环比预期提前终止;这可能会导致其他后果。我心中并没有具体的攻击向量,但我也看到了::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报告)
...