MySQL CONCAT è abbastanza compatibile con PDO per proteggere i like dall'iniezione SQL?

3

Sto sviluppando un sito web accessibile agli utenti accessibile al pubblico in cui l'utente può inserire un termine di ricerca arbitrario e ostile. Dopodiché, l'app deve fare qualcosa concettualmente simile a un db MySQL

SELECT fields FROM table WHERE field1 LIKE %user_input%

Devo farlo accadere in un modo sicuro con SQL injection. Quindi il mio primo pensiero è usare PDO come faccio ovunque:

SELECT fields FROM table WHERE field1 LIKE :user_input_placeholder

$arrParam = array(":user_input_placeholder" => '%' . $user_input . '%')

Ma questa concatenazione di stringhe non mi sembra affatto sicura: se l'utente fornisce 'utente _% _ input' quella percentuale non verrà sfuggita e verrà analizzata come un char speciale SQL. Questo ha già un odore pericoloso.

Qualcuno a SO sembra essere d'accordo e propone di farlo:

SELECT fields FROM table WHERE field1 LIKE CONCAT('%', :user_input_placeholder, '%')

$arrParam = array(":user_input_placeholder" => $user_input)

Questo mi sembra migliore, ma, comunque, non sono sicuro al 100% che questo sarebbe privo di injection sql. Potresti confermare che questo è il modo corretto per farlo? In caso contrario, si prega di fornire un esempio fallito.

Nota: Devo rimanere portatile e usare la funzione PDO, quindi mysql_escape_string () non è una soluzione. Preferirei anche non rimuovere manualmente speciali SQL come% o _.

    
posta Dr. Gianluigi Zane Zanettini 30.09.2015 - 15:41
fonte

1 risposta

1

Utilizza SELECT fields FROM table WHERE LOCATE(:user_input_placeholder, field1) > 0 ma non ho idea di quanto sarebbe veloce / lento.

Vedi link per LOCATE(substr, str) definizione

Returns 0 if substr is not found in str, or returns the position of the occurence

    
risposta data 10.04.2017 - 10:30
fonte

Leggi altre domande sui tag