欢迎!请查看关于页面以了解更多关于如何使用此功能的信息。
在罕见情况下,使用关键字作为transducers的哨兵值可能会将某些应用程序暴露于错误和潜在的安全风险。
(sequence (partition-by keyword) ["1" "none" "2" "clojure.core/none" "3" "4"]) ;(["1"] ["none"] ["2"] ["clojure.core/none" "3"] ["4"])
理想情况下,应使用一个私有或局部值,该值不能注入到函数域中,例如{{(Object.)}}。
评论由:rickmoynihan
很抱歉破坏了代码片段的格式,我也没有打算将其标记为重要。尽管我似乎无法编辑它,也许其他人可以。
还要感谢#clojure-uk上的@reborg和@bronsa分享上述代码片段。
评论由:alexmiller
Rick - 我已经将您添加到必要的编辑权限群体中。
这怎么会构成安全风险呢?
感谢提升我的权限,Alex。
我本无意过度强调,但可能最终还是做到了!:-)
我的想法是,如果你在用transducer来映射/归约用户输入值,那么攻击者可能会导致一个循环比预期早结束;这可能会产生其他后果。我没有特定的攻击向量,但我见过 ::halt 信号兵,想象用户可以将 "clojure.core/halt" 注入到HTTP头部。如果ring有用于将关键字化为键的中间件,那么用户就可以注入一个transducer的信号兵值,而这个信号兵值可能会被用来绕过其他字段的验证/编码/转义等。
然而,我更多地看了看 {{halt-when}} 实现以及其他transducer,似乎键永远不会与用户数据混合;一些transducer函数使用 ::none 来表示第一次遍历。所以看起来我搞错了。现在我不太认为这个问题值得解决。