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

AlexVo

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.

Beispiel:
//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 "???";
}

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

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.
 
kneitzel

kneitzel

Top Contributor
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.
 
L

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

AlexVo

Mitglied
Hallo,

vielen Dank. Habe das mal getestet.

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;

    }

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.
 
kneitzel

kneitzel

Top Contributor
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?
 
T

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

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
 
L

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.
 
L

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

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.

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;
    }
 
L

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

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.
 
L

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

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
 
L

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.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Scheint bei mir kein Problem zu sein.
Bekomme: javax.script.ScriptException: <eval>:1:135 Illegal character in identifier
Du benutzt JavaScript als ScriptEngine (zumindest im Code oben), @LimDul redet aber von Java.

Mit Javascript hast du potentiell noch mehr Fallstricke (eval, mehrere Arten von Strings, Semikolon nicht nötig...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
O String mit Character vergleichen Java Basics - Anfänger-Themen 3
I String.split regex Frage Java Basics - Anfänger-Themen 2
H Methode über String Wert aufrufen Java Basics - Anfänger-Themen 8
tobikoch String x= null Bedeutung Java Basics - Anfänger-Themen 9
GAZ String replace() Elemente tauschen Java Basics - Anfänger-Themen 13
R String in char-Array übertragen Java Basics - Anfänger-Themen 5
T Zeichen im String verschiebe Java Basics - Anfänger-Themen 9
J Verschieben von Buchstaben in einem String um vorgegebene Anzahl von Zeichen innerhalb eines weiteren String Java Basics - Anfänger-Themen 12
P Datentypen Array und String Java Basics - Anfänger-Themen 2
javapingu Hex String zu long Java Basics - Anfänger-Themen 2
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
Vamecruft Compiler-Fehler public static void zu static String ändern Java Basics - Anfänger-Themen 2
O if Abfrage erkennt String nicht Java Basics - Anfänger-Themen 1
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
A keine Ergebnisse - String nummer in array nummer converting Java Basics - Anfänger-Themen 1
O Datentypen String teilen Java Basics - Anfänger-Themen 5
macle Rekursive String Methode, Gerade Zahlen rausfiltern Java Basics - Anfänger-Themen 10
B String to int Java Basics - Anfänger-Themen 11
D String value change listener Java Basics - Anfänger-Themen 2
I Wo am besten eine String Konstante initialisieren? Java Basics - Anfänger-Themen 5
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
B String to Float Java Basics - Anfänger-Themen 27
B Map<String, FilterMeta, wie Wert bekommen? Java Basics - Anfänger-Themen 4
Dimax stream in string[] speichern Java Basics - Anfänger-Themen 6
Dimax String Probleme Java Basics - Anfänger-Themen 12
H Wie wird ein String intern gespeichert? Java Basics - Anfänger-Themen 10
C String auf Dualzahl überprüfen Java Basics - Anfänger-Themen 5
L Mit Zahlen im String rechnen Java Basics - Anfänger-Themen 19
A final String verrechnen Java Basics - Anfänger-Themen 2
N String N-Gramme mit Stream erstellen Java Basics - Anfänger-Themen 7
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
Z Matrix Klasse mit Mehrdimensionalen Array (Addition, Multiplikation, to String) Java Basics - Anfänger-Themen 57
J Eine Position im String durch einen Integer - Wert teilen Java Basics - Anfänger-Themen 5
Dimax Erste Schritte String replace alle Zeichen Java Basics - Anfänger-Themen 10
F Auto String mit Array Name aus Datei... oder so ähnlich Java Basics - Anfänger-Themen 4
J Characters als String zusammenfassen Java Basics - Anfänger-Themen 3
D Input/Output Mehrzeiligen String aus Textdatei erstellen Java Basics - Anfänger-Themen 5
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
F String auf E-Mail kürzen Java Basics - Anfänger-Themen 11
J String aus einem Array entfernen Java Basics - Anfänger-Themen 10
S String index out of range Java Basics - Anfänger-Themen 11
L String in Do-While-Schleife Abbruchkriterium Java Basics - Anfänger-Themen 1
V int zu Integer und String Java Basics - Anfänger-Themen 6
X Erste Schritte String: Alle doppelten Leerzeilen entfernen Java Basics - Anfänger-Themen 21
J String Array zu Map<Character, List<Character>> mit Streams Java Basics - Anfänger-Themen 1
P Datenspeichern im String Java Basics - Anfänger-Themen 5
J String wird in GUI falsch ausgegeben Java Basics - Anfänger-Themen 10
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
S String umwandeln Java Basics - Anfänger-Themen 6
S Ersetzen eines Asterix in einem String Java Basics - Anfänger-Themen 8
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Anzeige

Neue Themen


Oben