web-dev-qa-db-fra.com

Comment échapper les guillemets simples pour l'insertion SQL ... lorsque la chaîne à insérer se trouve dans une variable générée par l'utilisateur

Je construis une commande d'insertion à exécuter à l'aide de jdbc. Cela consiste en partie à concaténer une chaîne générée par l'utilisateur ... tout cela fonctionne jusqu'à ce que l'utilisateur utilise une chaîne comme celle-ci:

a B c d

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

statement.executeUpdate(insertTableSQL);
18
user947659

Vous pouvez effectuer l'une des opérations suivantes:

  1. Utilisez la classe PreparedStatement. ( Recommandé )

    String userString="a'bcd";
    String myStatement = " INSERT INTO MYTABLE (INSERTCOLUMN) VALUES (?)";
    PreparedStatement statement= con.prepareStatement   (myStatement );
    statement.setString(1,userString);
    statement.executeUpdate();
    
  2. Échappez aux guillemets simples.

    En SQL, les guillemets simples seront échappés en utilisant des guillemets simples doubles. ' -> ''

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

Vous pouvez utiliser StringEscapeUtils à partir de la bibliothèque Apache Commons Lang . En utilisant cela, vous pouvez échapper des caractères de html, xml, sql, etc. Recherchez la méthode escapeXXX pour votre usage. Pour référence: Quand j'ai besoin d'échapper à la chaîne Html?

note: escapeSql a été supprimé dans Apache Commons Lang 3 (voir Migration de StringEscapeUtils.escapeSql depuis commons.lang qui fait référence https://commons.Apache.org/proper/ commons-lang/article3_0.html # StringEscapeUtils.escapeSql )

Par exemple:

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

Contribution:

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

Sortie:

&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;
7
Divya

Voici une autre option:

Utilisez une méthode native Android conçue à cet effet:

DatabaseUtils.sqlEscapeString(String)

Voici la documentation en ligne:

Le principal avantage de l'utilisation de cette méthode, à mon avis, est l'auto-documentation en raison du nom clair de la méthode.


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

statement.executeUpdate(insertTableSQL);
1
leoneboaventura