我想从输入文件中读取字符串(用户可能已修改也可能未修改)。我想将此字符串视为要使用固定数量的参数调用的格式指令。但是,我了解一些格式指令(特别是~/
我想到)可能会被用来注入函数调用,使得这种方法本质上是不安全的。
使用时read
为了在 Common Lisp 中解析数据,该语言提供了*read-eval*
动态变量可以设置为nil
禁用#.
代码注入。我正在寻找类似的东西,可以防止格式指令内的代码注入和任意函数调用。
如果用户不能引入自定义代码而只能引入格式化字符串,那么就可以避免以下问题print-object
。记得使用with-standard-io-syntax http://clhs.lisp.se/Body/m_w_std_.htm(或其定制版本)来控制您将生成的确切输出类型(考虑*print-base*
, ...).
您可以扫描输入字符串来检测是否存在~/
(but ~~/
有效)并拒绝解释包含黑名单结构的格式。
然而,有些分析比较困难,您可能需要在运行时采取行动。
例如,如果格式字符串格式错误,您可能会遇到必须处理的错误(此外,您可能会为预期参数提供错误的值)。
即使用户没有恶意,您也可能会遇到迭代构造问题:
~{<X>~:*~}
...永远不会停止,因为~:*
倒带当前参数。为了处理这个问题,您必须考虑到<X>
可能会或不会打印一些东西。您可以实施这两种策略:
- 设置超时以限制格式化所需的时间
- 当写入太多时(例如写入字符串缓冲区),让底层流到达文件末尾。
可能还有其他我目前没有看到的问题,请小心。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)