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 _.