2016-11-18 5 views
-2

Grundsätzlich habe ich String str="That's an apple and that's not an apple, hah. Not funny.". Zu Ihrer Information: Die Zeichenfolge könnte zufällig sein und könnte ein beliebiges Unicode-Zeichen enthalten. Ich muss \ vor allen ' & " hinzufügen, damit ich es in meiner MySQL-Datenbank als Zeilenwert speichern konnte. Und wenn du könntest, würdest du mir vorher sagen, welche anderen Zeichen ich hinzufügen muss \.Wie speichern Sie Anführungszeichen als Zeichenfolge in MySQL mit Java?

würde ich wirklich schätzen, wenn jemand mir sagen, wie \ vor allem ' & " hinzuzufügen.


auf Empfehlung Basierend gab Sie mir, dass ich zufällig kommen, dies zu tun:

public String UpdateDBQuery(String query, int hm) throws IOException{ 
    try { 
     DBConnect mysql_DB = new DBConnect(); 
     PreparedStatement ps = con.prepareStatement(query); 
     for(int i=0;i<hm;i++){ 
      ps.setString(i, query); 
     } 

     int ursa = ps.executeUpdate(query); 
     if (ursa == 0) { 
      throw new SQLException("Creating user failed, no rows affected."); 
     } else { 
      return "succeed"; 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

Und die Anfragen, die dann nenne ich:

mysql.UpdateDBQuery("UPDATE tb1 SET ste='"+str1+"' WHERE pd='"+pd+"'", 1); 

Und

mysql.UpdateDBQuery("INSERT INTO list(str, str1, str2, str3, str4, str5) VALUES ('"+str+"', '"+str1+"', '"+str2+"', '"+str3+"', '"+str4+"','stackdefaultimage.png')", 6); 

Aber ich bekomme ein excepti auf dem Sprichwort:

java.sql.SQLException: Parameterindex außerhalb des Bereichs (0 < 1).

+2

"so könnte ich es in meiner mysql db als Spaltenwert speichern" - es klingt wie Sie versuchen, den Wert in Ihre SQL-Anweisung einzubetten. ** Tun Sie das nicht. ** Verwenden Sie stattdessen parametrisiertes SQL und legen Sie einfach den Wert Ihres Parameters als ursprüngliche Zeichenfolge fest. Dies ist einfacher und zuverlässiger und ist bei weitem der beste Weg, SQL-Injection-Angriffe zu vermeiden. –

+1

Mehr darüber, warum nicht zu tun, und was stattdessen zu tun: http://bobby-tables.com –

+0

@JonSkeet Sorry, ich meinte Zeilenwert. BTW Ich sende nicht direkt mysql Ausgabe-Ergebnis an den Client Ich bekomme die erforderlichen Daten von mysql respose und sende es an den Client und wenn eine Ausnahme passiert, ich antworte mit etwas ging schief. Ich denke, das könnte von Mysql Injektion perfect sein? –

Antwort

1

muss ich \ hinzufügen, bevor alle ' & " so konnte ich es db als Spaltenwert in meiner mysql speichern.

Nein, das müssen Sie nicht tun. Stattdessen müssen Sie parametrisierte Anweisungen verwenden (PreparedStatement und so). Wenn Sie nur ' und " umgehen, bleibt Ihr Code sowohl für SQL Injection als auch für nicht-schädliche Fehler offen.

Statt:

PreparedStatement ps = connection.prepareStatement("INSERT INTO Table (Column) VALUES (?)"); 
ps.setString(1, yourString); 
ps.executeUpdate(); 

... oder ähnliches. Beachten Sie die Verwendung von ? als Platzhalter, und beachten Sie, dass beim Festlegen von Werten für Platzhalter bei 1 (statt 0 wie Sie erwarten) beginnen.

Mehr hier: http://bobby-tables.com/


Wenn Sie benötigt alle ' mit \' und alle " mit \" für einige anderen Grund (nicht zu prepping eine Zeichenfolge für SQL verwandt) zu ersetzen, könnten Sie tue das mit replaceAll:

str = str.replaceAll("([\"'])", "\\\\$1"); 

b ut tue dies nicht, um Werte für SQL vorzuverarbeiten. Die () in der Ersatzregex erstellen eine Erfassungsgruppe und die $1 verwendet den Wert dieser Gruppe in der Ersetzung.Um den umgekehrten Schrägstrich in die Ersetzung einzufügen, müssen wir ihn doppelt entschlüsseln, da wir ihn für das Zeichenfolgenliteral und in der Ersetzungszeichenfolge ausschließen müssen (andernfalls wird die $ entfernt und die Gruppensubstitution wird verhindert).

Nochmal: Do not tun, um Werte für SQL-Anweisungen vorzubereiten. Verwenden Sie PreparedStatement und ähnliches.

+0

Danke für deine Antwort, ich habe dir nur gesagt Aber ich bekomme eine Ausnahme, du kannst das Update in meiner Frage lesen. –

+0

@mrjorden: Lesen Sie mehr sorgfältig. Aus der Antwort: * "und beachten Sie, dass beim Setzen von Werten für Platzhalter beginnen sie bei 1 (statt 0 wie Sie vielleicht erwarten)." * –

+0

@mrjorden: Und Sie müssen die Strings einzeln übergeben, nicht als eine einzige query' string. Was Ihr Code versucht, ist die Verwendung derselben Zeichenfolge für alle Parameter. –

Verwandte Themen