2024年Clojure调查问卷!中分享你的想法。

欢迎!请查看关于页面,了解更多关于其工作原理的信息。

0
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发表的评论

还要感谢#clojure-uk中的@reborg和@bronsa分享上述代码片段。

0

由:alexmiller发表的评论

Rick - 我已经将您添加到必要的编辑权限组中。

这如何构成安全风险?

0

由:rickmoynihan发表的评论

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

我并不是有意过度篡改布丁,但我可能真的那么做了!:-)

我的推理是,如果你使用转换器来映射/归约从用户输入获取的值,那么攻击者可能会提前终止循环;这可能会带来其他后果。我并没有具体的攻击向量,但我看到有`::halt`这个哨兵值,并且想象用户可能可以将"clojure.core/halt"注入到HTTP头部。如果ring有一个将关键字化的中间件,那么用户注入的哨兵值可能会导致转换器短路验证/编码/转义等其他字段的验证/编码/转义等。

然而,我稍微研究了一下 {{halt-when}} 和其他转换器的实现,似乎关键字永远不会与用户数据混合;并且 ::none 用于表示某些转换器函数的第一遍扫描。所以看来我弄错了。我现在怀疑这值得解决。

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