2012-08-08 16 views
7

Voglio eseguire la seguente query con un singolo valore quotato.Inserire valori con quotazione singola in PostgreSQL

INSERT INTO web_camp_keywords (web_id, keyword) VALUES (195, 'abc'hotels') 

Voglio solo aggiungere il valore abc'hotels. Ho usato il backslash, ma non ha funzionato.

INSERT INTO web_camp_keywords (web_id, keyword) VALUES (195, 'abc\'hotels') 

Come posso risolvere questo?

+1

prova INSERT INTO web_camp_keywords (web_id, parola chiave) VALORI (195, 'abc''hotels') . ma perché non una dichiarazione preparata? –

+0

tnx. Non ho esperienza sulla dichiarazione preparata. Ci proverò. –

+2

@Asurya quindi la tua applicazione è PIENO di quelli che sono chiamati buchi di sicurezza di iniezione SQL. Immagina cosa succede se l'utente che ha inserito 'abc'hotels' in un modulo invece è entrato in' abc '; CANCELLA DA web_camp_keywords; - 'o peggio,' abc '; DROP SCHEMA public CASCADE; - '? * splat *, ci va l'intero database. Vedi http://en.wikipedia.org/wiki/SQL_injection (* Nota: il trucco 'DROP SCHEMA' non dovrebbe funzionare se la tua app si collega solo con le autorizzazioni minime richieste - non dovrebbe possedere le tabelle o essere un superutente - ma la tua app è probabilmente il proprietario dei tavoli. *) –

risposta

8

È possibile sfuggire alla citazione singola con un altro singolo.

INSERT INTO web_camp_keywords (web_id, keyword) 
VALUES (195, 'abc''hotels') 

Ma personalmente penso che dovresti usare prepared statements with bind parameters.

Tra le altre cose, l'uso di istruzioni preparate con i parametri di bind è uno dei modi più semplici per proteggere contro SQL injection, la più grande fonte di falle di sicurezza nelle applicazioni web.

+0

Chris, spero che la modifica sia OK. –

+0

@CraigRinger sembra buono –

2

Come Chris Moutray e altri hanno menzionato, sarebbe meglio se si usassero istruzioni pdo e preparate. Ecco un esempio su come è possibile preparare una dichiarazione, fornire la dichiarazione con i valori e quindi eseguirla. Ho lasciato fuori la connessione.

$statement = $pdo->prepare("insert into web_camp_keywords (web_id, keyword) values (:id, :keyword)"); 
$statement->bindValue(':id', 195); 
$statement->bindValue(':keyword', "abc'hotels"); 
$statement->execute(); 
Problemi correlati