如果有一个以文本形式生成 Java 代码的函数(类似于模板引擎,如果您愿意的话),您将如何清理用户提供的字段以防止代码注入(inject)?
例如,如果我使用类似于以下内容的模板:
void function_${user_provided_function_name}() {
// Do stuff
};
用户提供输入(){System.exit(0);}; void function_dummy
,生成的代码将是:
void function_(){System.exit(0);}; void function_dummy() {
// Do stuff
};
即使我很想不允许使用括号(以防止函数调用),这似乎也非常脆弱。
最佳答案
如果您想验证用户输入(按原样)以使代码可编译,则必须对user_provided_function_name
进行三项检查:
- 词法检查:必须是有效的 Java 标识符:以字母、美元
$
或下划线_
开头,然后出现零次或多次字母、美元、下划线或数字。 - 语法检查:它不能是 Java 关键字:
for
、while
、class
、abstract
、void
等 - 语义检查:它不能是来自
java.lang.Object
的方法:toString
、notify
、getClass
等(都不是其父类(super class)中不可重写的方法)。
为了完成第一条规则,正则表达式可以做到。一个 Set 就可以满足其他两个规则。
但是,如果您甚至愿意修改用户输入,则必须首先根据上面的第一条规则删除所有错误字符,使其成为有效的 Java 标识符,然后应用其他两条规则。
关于java - 如何清理 Java 生成代码的用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014577/