Estoy desarrollando un sitio web accesible al público y accesible al usuario, donde el usuario puede ingresar un término de búsqueda hostil y arbitrario. Después de eso, la aplicación debe hacer algo así conceptualmente contra una base de datos MySQL
SELECCIONE campos DE LA tabla DÓNDE campo1 LIKE% user_input%
Debo hacer que esto suceda de una manera segura con inyección SQL. Así que mi primer pensamiento es usar DOP como lo estoy haciendo en cualquier otro lugar:
SELECCIONE campos DE LA tabla DONDE campo1 MEJOR: user_input_placeholder
$ arrParam = array (": user_input_placeholder" = > '%'. $ user_input. '%')
Pero esta concatenación de cadenas no me parece segura en absoluto: si el usuario proporciona "entrada de usuario _% _ ', ese porcentaje no se escapará y se analizará como un carácter especial de SQL. Esto ya huele peligroso.
alguien más en SO parece estar de acuerdo y propone hacer esto:
SELECCIONE los campos DESDE la tabla DÓNDE campo1 LIKE CONCAT ('%',: user_input_placeholder, '%')
$ arrParam = array (": user_input_placeholder" = > $ user_input)
Esto me parece mejor, pero, aún así, no estoy 100% seguro de que esto sea libre de inyección de SQL. ¿Podría por favor confirmar que esta es la forma correcta de hacerlo? Si no es así, proporcione un ejemplo que falla.
Nota: debo permanecer portátil y usar la función PDO, por lo que mysql_escape_string () no es una solución. También preferiría no eliminar de forma manual las ofertas de SQL como% o _.