Sil*_*olo 6 sanitization common-lisp string-formatting
我想从输入文件(可能已经或可能没有被用户修改)中读取字符串.我想将此字符串视为要使用固定数量的参数调用的格式指令.但是,据我所知,某些格式指令(特别是,~/脑海中浮现)可能会用于注入函数调用,这使得这种方法本质上不安全.
当read用于解析Common Lisp中的数据时,该语言提供了*read-eval*动态变量,可以将其设置nil为禁用#.代码注入.我正在寻找类似的东西,以防止代码注入和格式指令内的任意函数调用.
如果用户不能引入自定义代码而只能引入格式化字符串,那么就可以避免print-object. 请记住使用with-standard-io-syntax(或其定制版本)来控制您将生成的确切输出类型(想想*print-base*,...)。
您可以扫描输入字符串以检测是否存在~/(但~~/有效)并拒绝解释包含列入黑名单的构造的格式。然而,有些分析比较困难,您可能需要在运行时采取行动。
例如,如果格式字符串格式错误,您可能会遇到必须处理的错误(此外,您可能会为预期参数提供错误的值)。
即使用户没有恶意,您也可能会遇到迭代构造问题:
~{<X>~:*~}
Run Code Online (Sandbox Code Playgroud)
...永远不会停止,因为~:*倒带当前的论点。为了处理这个问题,您必须考虑是否<X>可以打印某些内容。您可以实施这两种策略:
可能还有其他我目前没有看到的问题,请小心。