2014-10-13 13 views
12

Sto costruendo un comando di inserimento da eseguire usando jdbc. Parte di esso è quello di concatenare una stringa di user generated ... funziona tutto questo finché l'utente non utilizza una stringa come questa:Come evitare le virgolette singole per l'inserimento SQL ... quando la stringa da inserire è in una variabile generata dall'utente

a'bcd

String userString="a'bcd"; 
String insertTableSQL = "INSERT INTO myTable " 
          + "(insertColumn) " 
          + "VALUES(" 
           +"'"+userString+"'" 
           +")"; 

statement.executeUpdate(insertTableSQL); 
+2

è necessario utilizzare paramters. – SLaks

+2

https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java – Donal

risposta

28

Si può procedere in uno dei seguenti:

  1. Utilizzare istruzione preparata. (consigliati)

    String userString="a'bcd"; 
    String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)"; 
    PreparedStatement statement= con.prepareStatement (myStatement); 
    statement.setString(1,userString); 
    statement.executeUpdate(); 
    
  2. sfuggire alle singole citazioni.

    In SQL, le virgolette singole vengono sfuggite utilizzando doppie virgolette singole. ' ->''

    String userString="a'bcd"; 
    String changedUserString = userString.replace("'","''"); 
         //changedUserString = a''bcd 
    String insertTableSQL = "INSERT INTO myTable (insertColumn) VALUES(" 
             +" '"+changedUserString +"')"; 
    
3

È possibile utilizzare StringEscapeUtils fornito da Java StringEscapeUtils Usando questo si può sfuggire personaggi di HTML, XML, etc.look mysql per il metodo escapeXXX per il vostro scopo. Per riferimento - When i need to escape Html string? Eg:

String str = FileUtils.readFileToString(new File("input.txt")); 
     String results = StringEscapeUtils.escapeHtml(str); 
     System.out.println(results); 

ingresso:

<sometext> 
Here is some "Text" that I'd like to be "escaped" for HTML 
& here is some Swedish: Tack. Vars?god. 
</sometext> 

uscita:

&lt;sometext&gt; 
Here is some &quot;Text&quot; that I'd like to be &quot;escaped&quot; for HTML 
&amp; here is some Swedish: Tack. Vars&aring;god. 
&lt;/sometext&gt; 
+3

In StringEscapeUtils documentationfor per escapeSQL: "Al momento, questo metodo trasforma solo le virgolette singole in virgolette doppie" – potapuff

+3

StringEscapeUtils.escapeSql è [ammortizzato] (https : //commons.apache.org/proper/commons-lang/article3_0.html). – chancyWu

+1

Questo approccio funziona solo se si intende utilizzare l'input come output HTML in seguito. A proposito della deprecazione, la v3.6 di commons-lang è ancora lì e funziona bene con org.apache.commons.text. [StringEscapeUtils] (https://commons.apache.org/proper/commons-text/javadocs/api-release /org/apache/commons/text/StringEscapeUtils.html). – Alfabravo

0

Ecco un'altra opzione:

Utilizzare un metodo nativo Android progettato per esattamente questo pu rpose:

DatabaseUtils.sqlEscapeString(String) 

Ecco la documentazione per esso on-line:

Il vantaggio principale di questo metodo, a mio parere, è l'auto-documentazione a causa della cancellare il nome del metodo.


String userString="a'bcd"; 
String insertTableSQL = "INSERT INTO myTable " 
          + "(insertColumn) " 
          + "VALUES(" 
           +"'"+DatabaseUtils.sqlEscapeString(userString)+"'" 
           +")"; 

statement.executeUpdate(insertTableSQL); 
Problemi correlati