2012-04-15 11 views
1

Ich schreibe eine Ruby on Rails App, die mit Benutzereingaben Java-Code erzeugen wird, die der Server dann kompilieren & ausführen wird. (Fragen Sie nicht warum;)Sanitizing Strings für proceduell generierten Java in RoR

Das Problem ist, dass die Benutzer in Zeichenfolgen eingeben können, die als Zeichenfolgenliterale in Java verwendet werden müssen. Ich habe zuvor die Zeichen in weißer Schrift aufgelistet, aber dieser Ansatz bietet den Benutzern nicht genügend Flexibilität. Wie kann ich die Zeichenfolge in RoR bereinigen, um zu verhindern, dass Benutzer die Zeichenfolgen abbrechen und so beliebigen Code auf dem Server ausführen können?

Antwort

2

Der einzige Weg, um eine Zeichenfolge in Java zu beenden ist ", aber Sie wil wollen auch für Unicode-Literale \u... überprüfen, wie Benutzer die Unicode-Zeichen von illegalen Zeichen eingeben kann (das erste, was die Java-Kompilierung tut, ist Suche nach Unicode-Literale und ersetze sie durch das richtige Zeichen). Wenn Sie sowohl " als auch \ nicht zulassen, sollten Sie Java-Strings nicht beenden können.

Sie haben nicht erwähnt, was Sie diese Eingabe verwenden für aber eine sicherere Art und Weise neben Ihrer Java-Klasse wäre eine Benutzereingabe in eine separate Datei zu speichern und stattdessen so etwas wie zu tun:

String input = "#USER_INPUT#"; 

können Sie lesen Sie den Text von der Benutzereingabedatei, die Sie gespeichert:

String input = readUserInputFile(); 

und readUserInputFile() ist so etwas wie:

public String readUserInputFile() { 
    InputStream is = this.class.getClassloader.getResourceAsStream("user-input.txt"); 
    StringBuffer text = new StringBuffer(); 
    // read input stream into text 
    return text.toString(); 
} 

Auf diese Weise kann ein Benutzer eingeben, was sie wollen, und es gibt eine klare Grenze zwischen dem generierten Java-Code und der Benutzereingabe, die nicht überschritten werden kann.

+0

Fantastische Antwort, danke! – jms301