gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:35:38 25 4
gpt4 key购买 nike

如果有一个以文本形式生成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com