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

标签 java security code-generation code-injection sanitization

如果有一个以文本形式生成 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 关键字:forwhileclassabstractvoid
  • 语义检查:它不能是来自 java.lang.Object 的方法:toStringnotifygetClass 等(都不是其父类(super class)中不可重写的方法)。

为了完成第一条规则,正则表达式可以做到。一个 Set 就可以满足其他两个规则。

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

关于java - 如何清理 Java 生成代码的用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43014577/

相关文章:

java - Java 中的计数和终止字符串

java - 返回 map 值的 Freemarker 函数

java - Eclipse 崩溃并出现错误 JVM 已终止。退出代码=11

java - 在没有 "catalog"属性的情况下运行 hibernate 工具注释生成

scala - 为 Scala val/var/def 插入推断类型注释

wsdl - 使用 XML 目录从 WSDL 生成代码

java - Java中通用括号之间没有空格的推理

html - 在不打扰用户的情况下在安全和不安全连接之间切换的最佳方法

security - Swift 能抵抗 hook 吗?

php - 如何防止 PHP 中的 SQL 注入(inject)?