2012-04-15 59 views
1

我正在編寫一個Ruby on Rails應用程序,它將與用戶輸入一起生成一些Java代碼,然後服務器將編譯&執行。 (不要問爲什麼;)在RoR中爲程序生成的java消毒字符串

問題是用戶能夠輸入需要在Java中用作字符串文字的字符串。之前我曾將這些角色列入白名單,但這種方法爲用戶提供的靈活性不足。如何在RoR中清理字符串以防止用戶終止字符串,從而能夠在服務器上執行任意代碼。

回答

2

在java中終止字符串的唯一方法是",但是你也想檢查Unicode文字\u...,因爲用戶可以輸入非法字符的Unicode字符(java編譯的第一件事是搜索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代碼和不能交叉的用戶輸入之間存在明確的邊界。

+0

非常棒的答案,謝謝! – jms301 2012-04-16 09:46:02