有一个以文本形式生成Java代码的函数(类似于模板引擎,如果你愿意),你将如何清理用户提供的字段以防止代码注入?
例如,如果我使用的模板类似于:
void function_${user_provided_function_name}() {
// Do stuff
};
用户提供输入(){System.exit(0);}; void function_dummy
,生成的代码为:
void function_(){System.exit(0);}; void function_dummy() {
// Do stuff
};
即使我试图不允许括号(以防止函数调用),这似乎非常脆弱。
答案 0 :(得分:1)
如果您想验证用户输入(按原样)以使您的代码可编辑,则必须对user_provided_function_name
进行三次检查:
$
或下划线_
开头,然后是字母,美元,下划线或数字的零或更多次。for
,while
,class
,abstract
,void
等。java.lang.Object
:toString
,notify
,getClass
等的方法(也不是来自其超类的不可覆盖的方法)。 要完成第一条规则,正则表达式可以执行此操作。单个Set可以用于其他两个规则。
但是如果您甚至愿意修改用户输入,则必须首先根据上面的第一条规则删除所有错误的字符,使其成为有效的Java标识符,然后应用其他两个规则。