Common Lisp中格式指令的安全解析

Sil*_*olo 6 sanitization common-lisp string-formatting

我想从输入文件(可能已经或可能没有被用户修改)中读取字符串.我想将此字符串视为要使用固定数量的参数调用的格式指令.但是,据我所知,某些格式指令(特别是,~/脑海中浮现)可能会用于注入函数调用,这使得这种方法本质上不安全.

read用于解析Common Lisp中的数据时,该语言提供了*read-eval*动态变量,可以将其设置nil为禁用#.代码注入.我正在寻找类似的东西,以防止代码注入和格式指令内的任意函数调用.

cor*_*ump 4

如果用户不能引入自定义代码而只能引入格式化字符串,那么就可以避免print-object. 请记住使用with-standard-io-syntax(或其定制版本)来控制您将生成的确切输出类型(想想*print-base*,...)。

您可以扫描输入字符串以检测是否存在~/(但~~/有效)并拒绝解释包含列入黑名单的构造的格式。然而,有些分析比较困难,您可能需要在运行时采取行动。

例如,如果格式字符串格式错误,您可能会遇到必须处理的错误(此外,您可能会为预期参数提供错误的值)。

即使用户没有恶意,您也可能会遇到迭代构造问题:

~{<X>~:*~}
Run Code Online (Sandbox Code Playgroud)

...永远不会停止,因为~:*倒带当前的论点。为了处理这个问题,您必须考虑是否<X>可以打印某些内容。您可以实施这两种策略:

  • 设置超时以限制格式化所需的时间
  • 当写入太多时(例如写入字符串缓冲区),让底层流到达文件末尾。

可能还有其他我目前没有看到的问题,请小心。