如何清理Java生成代码的用户输入?

时间:2017-03-25 09:10:51

标签: java security code-generation code-injection sanitization

有一个以文本形式生成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
};

即使我试图不允许括号(以防止函数调用),这似乎非常脆弱。

1 个答案:

答案 0 :(得分:1)

如果您想验证用户输入(按原样)以使您的代码可编辑,则必须对user_provided_function_name进行三次检查:

  • 词法检查:它必须是有效的Java标识符:以字母,美元$或下划线_开头,然后是字母,美元,下划线或数字的零或更多次。
  • Sintactical check:它不能是Java关键字:forwhileclassabstractvoid等。
  • 语义检查:它不能是来自java.lang.ObjecttoStringnotifygetClass等的方法(也不是来自其超类的不可覆盖的方法)。

要完成第一条规则,正则表达式可以执行此操作。单个Set可以用于其他两个规则。

但是如果您甚至愿意修改用户输入,则必须首先根据上面的第一条规则删除所有错误的字符,使其成为有效的Java标识符,然后应用其他两个规则。