String zu Java Anweisung getString("*** java code ***")

AlexVo

Mitglied
Guten Morgen,

ich bin neu hier und hoffe das ihr mir bei meinem Problem helfen könnt.

Ich suche eine Möglichkeit Java Code, der als String übergeben wird, auszuführen.

Beispiel: Ich habe eine String (test2) dem ein Wert zugewiesen werden soll. Dafür gibt es ein getString Methode die als Übergabe-Wert Java Code zur Ermittlung des Strings hat. Der Java Code ist variable.

[CODE lang="java" title="Beispiel" highlight="3,5-8"]//Code im Programm
String test = (new Date()) + ("test".equals("test") ? " test_1" : " test_2") + " blabal";
String test2 = getString("(new Date()) + (\"test\".equals(\"test\") ? \" test_1\" : \" test_2\") + \" blabal\"");
...
private String getString(String code) {
//ToDo Ausführung code und return Result
return "???";
}
[/CODE]

test und test2 sollte das selbe Ergebnis dann haben (ja Date könnte natürlich ein Sekunde unterschiedlich sein).

Vielen Dank für die Hilfe!

Alex
 

AlexVo

Mitglied
Es geht um ein sehr umfassende Anwendung, wo der User eigene Werte erstellen soll und Importwerte bekommt. Der User kann ("soll können") Werte selber manipulieren und eigene kleine Convertierungen durchführen (Replace/ If Then Else usw.). Er wird diesen Convertierungscode im FrontEnd eingeben.

Ich hoffe das Hilft beim Verständnis.
 
K

kneitzel

Gast
Ich sehe da im Augenblick auch keinen wirklichen Sinn, aber JSR 223 bietet sowas. Java Scripting API:



Aber das sehe ich bei dem Anwendungsfall nicht wirklich als sinnvoll an.

Aber das wäre die technische Möglichkeit.
 

LimDul

Top Contributor
Ansonsten gibt es auch die Compiler API: https://docs.oracle.com/javase/8/docs/api/javax/tools/JavaCompiler.html

ABER Mit der Compiler-API auf jeden Fall, aber vermutlich auch mit Scripting API holst du dir riesige Sicherheitslücken rein. Es ist in 99,9% der Fälle eine schlechte Idee User auf einem eigenen System Code ausführen zu lassen. Nicht umsonst ist eval z:B. in PHP eine der Methoden, die für viele Sicherheitslücken verantwortlich ist.
 

AlexVo

Mitglied
Hallo,

vielen Dank. Habe das mal getestet.

[CODE lang="java" title="Example"]private String getString(String code) throws ScriptException, NoSuchMethodException {

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");

Bindings obj = (Bindings) engine.eval("var obj = { value: " + code + " }; obj; ");
String value = (String) obj.get("value");
return value;

}[/CODE]

Das tut.

Sicherheit ist eine Wichtige Frage, Gibt es Möglichkeiten den Code zu schützem, das nur zum Beispiel String und Date Funktionen ausgeführt werden? Und es soll ja nur eine Befehlszeile (also eine zuweisung) sein.
 
K

kneitzel

Gast
Du kannst Zur Not eine eigene Script Engine schreiben, die nur das erlaubt, das Du erlauben willst ...

Aber wenn es um Importe und so geht, da kann man durchaus diverse Dinge akzeptieren. Ich würde diese aber separat von der eigentlichen Datenbank / Applikation halten.

Ich kenne die genauen Anforderungen nicht, aber man könnte einen Support ja auch durchaus etwas aufteilen und dann über eine separate Datenbank laufen lassen. Dann hätte man ein gewisses Tooling, das hilft, Tabellen in dieser Datenbank zu befüllen (z.B. über Importmechanismen, die Du bereit stellst).

Und dann hat der Anwender direkt eine SQL Eingabemöglichkeit, d.h. er kann Connection String und die Abfrage vorgeben. Da die Datenbank komplett in "Anwenderkontrolle" ist, ist da erst einmal keine Sicherheitslücke. Er kann da zwar alles mögliche machen, aber wenn schon...
Und das gibt dem Kunden auch die Möglichkeit, wirklich frei Daten anzupassen. Ggf. kritische Daten kann er heraus filtern / löschen, ehe Du die Daten bekommst.

Aber da ist wirklich immer die Frage, was die genauen Anforderungen sind. Was muss erreicht werden?
 

thecain

Top Contributor
Ich würde dem User nur "Bausteine" geben, mit denen er seine Modifikationen und Konvertierungen "zusammensetzen" kann.

Dann kannst du im das im Backend ohne das ganze Scripting lösen, v.a. wenn Security wichtig ist, würde ich einen solchen Weg auf jeden Fall bevorzugen.
 

AlexVo

Mitglied
Ja wir haben angefangen einen eigenen Stringparser zu schreiben für IF Then Else, aber es ist sehr aufwendig und dadurch das man Java Code schreiben könnte, kann man auf die String Funktionen und IF Then Else sehr leicht zugreifen. Ich überlege ein Parser zu schreiben der die ";" z.B. checkt damit er keinen mehrzeiligen Code eingeben kann. Ausserdem habe ich gesehen, dass wenn man keine classes importiert und loads macht nur sehr beschränkte Klassen und Methoden zur Verfügung hat
 

LimDul

Top Contributor
Ich spiele jetzt mal den Buhmann - das mache ich auch gerne im Projekt :)

Brauchst du das? Wird das überhaupt jemand nutzen? Ist es den Aufwand wert? Die Frage kannst nur du beantworten und musst du auch nicht hier beantworten.
Aber dieses Feature hört sich nach einem klassischen Feature an, was irgendjemand für eine gute Idee hält, weil es total flexibel ist und viel ermöglicht - nur leider übersteigt die Komplexität der Nutzung die Fähigkeiten von 99% der Anwender. Sprich, stelle sicher, dass dieses Feature wirklich gebraucht wird und die Anwender auch in der Lage sind es zu nutzen. Oder ob nicht eine deutlich abgespeckte, Klicki-Bunti Version reicht wo ich vielleicht aus 20 Standard-Konvertierungen wählen kann. Damit deckt man dann vielleicht nur 80% der denkbaren Anwendungsfälle ab - aber für die wird es dann wenigstens genutzt.

Ich erlebe es oft genug (und ich bin da auch nicht gefeit vor - im Gegenteil) das man sich tolle Lösungen für Probleme überlegt und am Ende ist das ganze viel zu komplex und eigentlich wird was einfacheres benötigt.
 

LimDul

Top Contributor
Was mir gerade noch in den Sinn kommt, was du dir anschauen kannst, wäre Blockly: https://developers.google.com/blockly

Das wird in Smart Home Systemen gerne verwendet. Damit kann man ich über so Block-Strukturen Programm-Code zusammenstellen (Schleifen, Bedingungen, Verarbeitungen etc.). Das ist - im Gegensatz zu der Anwender muss syntaktisch korrekten Code schreiben - deutlich Benutzerfreundlicher. Und da müsstest dann "nur" die Custom Blöcke definieren, die für deine Anwender hilfreich sind.
 

AlexVo

Mitglied
Verstehe ich den Einwand, aber ich denke, dass meine Nutzer (PowerUser) die Java Funktionalität nutzen können. Es ist eben hier meiner Meinung nach gerade umgekehrt, wir müssten so viele eventualitäten programmieren, um die Funktionalität auf 80 % zu bringen, die mir die Java Funktionalität von Hause aus bringt. Wir müssen nur dafür sorgen, dass er keinen Unsinn macht.

Hier mal der erste Protoype vom Command Check. Es wird geschaut, ob ausserhalb von Zeichenfolgen ein ";" vorkommt, dann wird das Kommando abgelehnt.

[CODE lang="java" title="Example"]private String checkCommand(String text) {
String REGEX_STRINGS = "(\"([^\"]|\"\")*\")";

String workText = text.replace("\\\"", "$$$");

Matcher m = Pattern.compile(REGEX_STRINGS).matcher(workText);
StringBuffer sb = new StringBuffer();

// ESCAPE Strings
int i = 0;
while (m.find()) {
m.appendReplacement(sb,
Matcher.quoteReplacement("\"$" + i + "$\""));
i++;
}
m.appendTail(sb);
String testString = sb.toString();
System.out.println(testString);
if (testString.contains(";")) {
throw new IllegalArgumentException("command string not allowed");
}
return text;
}[/CODE]
 

LimDul

Top Contributor
Es kann ja durchaus sein, dass es bei dir sinnvoll ist - das kann und will ich nicht beurteilen.

Aber die Absicherung ist haarig. Weil das was du machst, funktioniert nicht vollständig. Folgender Code ist valider Java-Code:

Java:
        System.out.println("Test")\u003B

Import Statements sind in Java komplett optional, ich kann immer mit dem Full Qualified Class Name auf Klassen zugreifen.
 

AlexVo

Mitglied
Wenn ich das richtig getetstet habe, findet
Java:
if (testString.contains(";")) {
            throw new IllegalArgumentException("command string not allowed");
        }
auch das unicode zeichen vom simikolon.
 

LimDul

Top Contributor
im String steht nicht das Unicode Zeichen, sondern die Unicode-Repräsentation :)

Beispiel:

Test2.txt
Java:
package de.limdul.javaforum\u003B

public class Test2 {

    public Test2() {
        System.out.println("Ich bin Evil")\u003B
    }
}

Test.java:
Java:
package de.limdul.javaforum;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(
                "C:\\Pfad\\zur\\Test2.txt"));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
            System.out.println(line.contains(";"));
        }
    }

}

Ausgabe:
package de.limdul.javaforum\u003B
false

false
public class Test2 {
false

false
public Test2() {
false
System.out.println("Ich bin Evil")\u003B
false
}
false
}
false

Derartige Fallstricke wird es viele geben. Du müsstest mal schauen (da hab ich aber keine Ahnung davon) wie man solchen Code in einer Sandbox mit limitierten Rechten ausführen kann - weil das wäre dann die zweite Schutz-Schicht. Wenn jemand es schafft durch die Prüfungen ob der Code "gut aussieht" zu kommen, kommt er damit dann im Idealfall nicht an sensitive Informationen ran.
 

AlexVo

Mitglied
Der Test passt sowohl mit ; als auch mit dem unicode

Java:
 @Test
    public void semicolonTest() {
        String test = "abc;def";
        Assert.assertTrue(test.contains(";"));
        Assert.assertTrue(test.contains("\u003B"));

        String test2 = "abc\u003Bdef";
        Assert.assertTrue(test2.contains(";"));
        Assert.assertTrue(test2.contains("\u003B"));
    }

alle Test sind ok
 

LimDul

Top Contributor
Der Test passt sowohl mit ; als auch mit dem unicode

Java:
 @Test
    public void semicolonTest() {
        String test = "abc;def";
        Assert.assertTrue(test.contains(";"));
        Assert.assertTrue(test.contains("\u003B"));

        String test2 = "abc\u003Bdef";
        Assert.assertTrue(test2.contains(";"));
        Assert.assertTrue(test2.contains("\u003B"));
    }

alle Test sind ok
Dein String ist falsch. Der String test2 muss ein
Code:
        String test2 = "abc\\u003Bdef";
Du musst das Zeichen dort escapen, ansonsten steht da wirklich das ; drin. Es steht eben nicht das Semikolon drin sondern die Repräsentation davon.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
viktor1 Methoden Methode schreiben static void readText (String filename) {...} zu WordHistogramSample.java Java Basics - Anfänger-Themen 13
I String Expression mit Java validieren (true / false) Java Basics - Anfänger-Themen 34
I Java String einlesen und auslesen Java Basics - Anfänger-Themen 11
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
Z Methode zum Heraufinden von Anagrammen ohne Java API, Ausnahme String Java Basics - Anfänger-Themen 14
C Java String Methode Java Basics - Anfänger-Themen 6
H java string aufgabe Java Basics - Anfänger-Themen 10
S Java String[]args Übergabeparameter Java Basics - Anfänger-Themen 2
B Collections Java Wörter in String zählen und geordnet ausgeben Java Basics - Anfänger-Themen 10
M JAVA String schnell parsen Java Basics - Anfänger-Themen 14
F Methoden Java String aufteilen Java Basics - Anfänger-Themen 17
E Datentypen C# String zu Java String konvertieren Java Basics - Anfänger-Themen 3
L Java CMD Console in String umwandeln? Java Basics - Anfänger-Themen 2
D Java doppelte Zahlen auch über 10 in einem String entfernen Java Basics - Anfänger-Themen 2
L Java String to date? Java Basics - Anfänger-Themen 2
D Java doppelte Zahl/Zeichen in einem String entfernen Java Basics - Anfänger-Themen 6
W Methoden Rückgabedatentyp java.util.Map<java.lang.String,? extends ...> Java Basics - Anfänger-Themen 4
R Input/Output Java String abfragen Java Basics - Anfänger-Themen 3
J Klassen java.lang.String - lexikographisches Sortieren Java Basics - Anfänger-Themen 5
B Erste Schritte Java IDE schreibt "(String[] args)" Java Basics - Anfänger-Themen 5
M Compiler-Fehler Fehler Meldung java.lang.NumberFormatException: empty String Java Basics - Anfänger-Themen 2
S String index out of range: 8 at java.lang.String.substring(Unknown Source) Java Basics - Anfänger-Themen 13
Spin Java parse String to int Java Basics - Anfänger-Themen 2
M Java String " einfügen Problem Java Basics - Anfänger-Themen 2
Y Java Programm URL und String Vergleich! Java Basics - Anfänger-Themen 4
S expected java.lang.string but found char Java Basics - Anfänger-Themen 5
M Datentypen java.util.Arrays$ArrayList cannot be cast to [Ljava.lang.String; Java Basics - Anfänger-Themen 11
U Automatenprüfung in Java implementieren — String Vergleich klappt nicht Java Basics - Anfänger-Themen 40
J java.util.format => mit String? Java Basics - Anfänger-Themen 2
E JAVA Typ Short mit String ergänzen Java Basics - Anfänger-Themen 6
I java.lang.String cannot be cast to OBJEKT Java Basics - Anfänger-Themen 8
Developer_X Java String Spielereien Java Basics - Anfänger-Themen 18
K Fehler Meldung java.lang.NumberFormatException: empty String Java Basics - Anfänger-Themen 1
K Java String UNICODE in DB UTF-8 Feld einfügen Java Basics - Anfänger-Themen 3
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5
A Anfängerfrage - array required, but java.lang.String found Java Basics - Anfänger-Themen 7
B Java-Frame Taschenrechner - String -> Int und umgekehrt Java Basics - Anfänger-Themen 8
G string trennen in java 1.3 Java Basics - Anfänger-Themen 7
S java.io.* BufferedReader to String Java Basics - Anfänger-Themen 12
G String in java.sql.Date umwandeln Java Basics - Anfänger-Themen 4
S String für das java jre home verzeichnis Java Basics - Anfänger-Themen 3
J Java Aufgabe -> String einlesen, splitten,Substring & Java Basics - Anfänger-Themen 3
K Prob mit java.util.regex.matches-String wird nicht erkannt? Java Basics - Anfänger-Themen 9
S java.lang.String Fehler bei DB Abfrage Java Basics - Anfänger-Themen 4
W HTML in Java als String Java Basics - Anfänger-Themen 6
R Java 5.0 / String.format - Warning Java Basics - Anfänger-Themen 8
M.C.S. String parsen in Java Java Basics - Anfänger-Themen 5
Z Fehlermeldung: Exception. java.lang.String Java Basics - Anfänger-Themen 7
T Substrings in Strings ersetzen ohne java.lang.String Java Basics - Anfänger-Themen 8
M JTable getValueAt -- CastClassException : java.lang.String Java Basics - Anfänger-Themen 5
M String als Java-Code ausführen Java Basics - Anfänger-Themen 4
D String Groß/Kleinschreibung Ignorieren Java Basics - Anfänger-Themen 4
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J Ähnlichen String in Liste finden Java Basics - Anfänger-Themen 6
Kartoffel_1 String transformation Java Basics - Anfänger-Themen 7
H String-Operation replace() - Zeichenkette verdoppeln Java Basics - Anfänger-Themen 2
K String analysieren Java Basics - Anfänger-Themen 27
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
Beowend String auf Satzzeichen überprüfen? Java Basics - Anfänger-Themen 6
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
String in ArrayList umwandeln Java Basics - Anfänger-Themen 1
I Sass Compiler und String erhalten? Java Basics - Anfänger-Themen 7
Avalon String in Double bzw. Währung konvertieren Java Basics - Anfänger-Themen 6
T Methode akzeptiert String nicht Java Basics - Anfänger-Themen 18
F Arraylist<String>Ein Wort pro Zeile Java Basics - Anfänger-Themen 6
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
N String überprüfen Java Basics - Anfänger-Themen 3
E String zerlegen aus args Java Basics - Anfänger-Themen 1
M Long-Typ in String-Änderung führt zu keinem Ergebnis bei großer Zahl Java Basics - Anfänger-Themen 11
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
J String Filter Java Basics - Anfänger-Themen 5
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Größter zusammenhängender Block gleicher Zeichen im String Java Basics - Anfänger-Themen 1
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D 2D Char Array into String Java Basics - Anfänger-Themen 2
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
I Zerlegen von String Java Basics - Anfänger-Themen 3
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
I String Java Basics - Anfänger-Themen 4
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
H Zu langen String aufteilen - bequeme Methode? Java Basics - Anfänger-Themen 14
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
M Kommandozeilenparamter als EINEN String werten Java Basics - Anfänger-Themen 5
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13
BeginnerJava String mit vorgegebener Länge und Buchstaben erzeugen/ mit Leerstellen Java Basics - Anfänger-Themen 8
I Eindeutiger String mit maximaler Anzahl an Zeichen Java Basics - Anfänger-Themen 11
H Interface Wieso "List<String> list = new ArrayList<>[…]" Java Basics - Anfänger-Themen 4
JavaBeginner22 Integer in String umwandeln Java Basics - Anfänger-Themen 7
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
HolyFUT Input/Output Leerzeichen aus String entfernen - klappt nicht! Java Basics - Anfänger-Themen 13
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben