Android offertes binnen van een sql-query string

Ik wil uitvoeren de volgende query:

uvalue = EditText( some user value );
p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;
mDb.rawQuery( p_query, null );

als de gebruiker een enkel citaat in de input van het crasht. Als u deze hebt gewijzigd in:

p_query = "select * from mytable where name_field = \"" +  uvalue + "\"" ;

het loopt vast als de gebruiker een dubbele aanhalingstekens in hun inbreng.
en uiteraard konden ze altijd zowel enkele als dubbele aanhalingstekens.

InformationsquelleAutor miannelle | 2009-08-18

 

6 Replies
  1. 129

    Moet u gebruik maken van de rawQuery methode selectionArgs parameter:

    p_query = "select * from mytable where name_field = ?";
    mDb.rawQuery(p_query, new String[] { uvalue });

    Dit lost niet alleen uw offertes probleem, maar ook beheerst SQL-Injectie.

    • Ik wou dat ik kon upmod dit meer dan één keer!
    • Het is ook veel sneller omdat Sqlite niet parseren van iedere sql-instructie.
    • Inderdaad, moet u gebruik maken van query argumenten. U kunt echter ook gebruik maken van de DatabaseUtils om te ontsnappen aan de snaren, als dat nodig is. Bijvoorbeeld, DatabaseUtils.sqlEscapeString(). Het is niet de beste manier, maar het is beschikbaar. Kan handig zijn als je probeert om een raw-SQL-instructie over aan iets externs.
    • bedankt! Als men niet kan binden vectoren van snaren voor gebruik met de IN-operator sqlEscapeSting() was net wat ik nodig had!
    • Dit werkt niet zo goed als je zou denken. Als u een tekenreeks als dit het breekt: “monster” string “dat breekt stuff”
    • Met behulp van ‘selectionArgs’ parameter werkt niet wanneer het vraagteken gaat binnen een ‘LIKE’ – tekenreeks (bijvoorbeeld: SELECT * FROM Tabel kolom WHERE, ZOALS ‘%?%’). In dit geval moet u gebruik maken van string concatenatie en DatabaseUtils.sqlEscapeString is een goede praktijk om te voorkomen dat een SQL-injectie.

  2. 14

    DatabaseUtils.sqlEscapeString werkte goed voor mij. De string is omsloten door enkele aanhalingstekens, en de enkele aanhalings tekens in de string worden dubbele aanhalingstekens.
    Geprobeerd met behulp van selectionArgs in de getContentResolver().query (), maar het werkt niet bij alle.

    • De DatabaseUtils.sqlEscapeString vervangt één of twee speciale tekens waar het nodig is te vervangen alle speciale tekens, is er geen manier om vervanging van bepaalde of alle speciale tekens?
  3. 4

    Moet u

    p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;

    zoals

    p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ;
    • maar je moet verwijderen tussen aanhalingstekens omdat ze worden standaard toegevoegd
  4. 2

    Heb je geprobeerd het vervangen van een enkele quote met 2 enkele aanhalingstekens? Dat werkt voor het invoeren van gegevens in een database.

    • Ik zou de voorkeur geven aan de bovenkant antwoord, maar in mijn geval was het niet mogelijk om het ontwerp van de applicatie. Dit werkt ook
  5. 1

    Ik geef de voorkeur om te ontsnappen Enkele aanhalingstekens en Dubbele aanhalingstekens in elke insert-instructie met Sqlite, zoals deze:

     String sqlite_stament = sqlite_stament.replace("'", "''").replace("\"", "\"\"");
  6. 0

    Ik heb hetzelfde probleem, maar nu is het opgelost worden door het schrijven van de code zoals
    in uw geval u wilt invoegen waarde u-waarde .Schrijf als

    uvalue= EditText( some user value );
    uvalue = uvalue.replaceAll("'", "''");
    p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;
    mDb.rawQuery( p_query, null );

    cool..!!

    • dat is dom, je vervangt ‘ met ” die altijd problemen veroorzaakt.
    • Dat is niet dom, de standaard SQL manier om te ontsnappen aan een enkel aanhalingsteken in een string literal is om het te verdubbelen, zodat '''' is een SQL-string literal waarin één enkele offerte. Handmatig ontsnappen snaren voor SQL misschien niet het beste idee, maar het resultaat is juist in dit geval.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *