假设我在Lua中定义了这样的变量
local input = "..."
...
来自用户提供的字符串。该用户仅从变量定义就能执行代码注入吗?我需要清理字符串吗?
答案 0 :(得分:2)
通常,如果您需要问自己是否需要清理输入内容,正确的答案是“是”。
对于这种特殊情况,如果仅将用户的字符串直接复制/粘贴到Lua源文件中,即使使用这样的引号,他们也将能够执行任意代码。这甚至不是特别困难。他们可以提供some text"; my_code = 20; last = "end of string
。
解决此问题的最佳方法是使用带有[[...]]
语法的长格式文字字符串。但是即使那样也可以破解,因此您需要在给定的字符串中搜索=
字符的重复序列。每次找到一个序列时,请注意该序列中有多少个=
字符。搜索后,在您的文字字符串中插入许多=
个字符,这些字符不是用户字符串中找到的长度之一。
当然,Lua的内部实现可能会对长格式文字字符串中=
序列的长度有所限制。在这种情况下,外部用户可以通过强迫您使用比实现所支持的更长的序列来破坏。但是它不会导致任意代码执行;您只会得到一个编译错误。