我正在编写一个Ruby on Rails应用程序,用户输入将生成一些Java代码,服务器将编译这些代码。执行。 (不要问为什么;)
问题是用户能够输入需要在Java中用作字符串文字的字符串。我之前在白名单中列出了这些字符,但这种方法为用户提供的灵活性不足。如何清理RoR中的字符串,以防止用户终止字符串,从而能够在服务器上执行任意代码。
答案 0 :(得分:2)
在java中终止字符串的唯一方法是"
,但是你也想检查Unicode文字\u...
,因为用户可以输入非法字符的Unicode字符(java的第一个东西) compile确实是搜索Unicode文字并用正确的字符替换它们。如果您同时禁用"
和\
,则无法终止java字符串。
您还没有提到您使用此输入的内容,但更安全的方法是将用户输入保存到java类旁边的单独文件中,而不是执行以下操作:
String input = "#USER_INPUT#";
您可以从保存的用户输入文件中读取文本:
String input = readUserInputFile();
和readUserInputFile()
类似于:
public String readUserInputFile() {
InputStream is = this.class.getClassloader.getResourceAsStream("user-input.txt");
StringBuffer text = new StringBuffer();
// read input stream into text
return text.toString();
}
通过这种方式,用户可以输入他们想要的任何内容,并且生成的java代码与无法跨越的用户输入之间存在明确的界限。