sql >> Base de Datos >  >> RDS >> Mysql

vulnerabilidades mysql_escape_string

La mala respuesta:

No de forma fiable. Te refieres a mysql_escape_string() , que no tiene en cuenta la codificación de la conexión (mientras que mysql_real_escape_string() lo hace).

Entonces, tal vez una cadena cuidadosamente diseñada, con un punto de código UTF8 incompleto cuidadosamente diseñado al frente, podría dar como resultado, digamos, un signo de comillas escapado por mysql_escape_string() pero MySQL ignora el escape ya que lo "verá" como un carácter UTF8.

Por ejemplo:

0xC2' OR 1=1 ;--

sería escapado por mysql_escape_string() como

0xC2\' OR 1=1 ;--

que se ensamblaría a

WHERE password='0xC2\' OR 1=1 ;--';

y visto por MySQL (si la codificación de conexión adecuada estaba en efecto) como, por ejemplo,

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

que sería una inyección SQL clásica.

Pero esto juega con el hecho de que especificaste, tal vez por distracción, una función doblemente obsoleta . Si realmente te estuvieras refiriendo a mysql_real_escape_string() , entonces no funcionaría.

Además, esto supone que ni el servidor ni la capa de la aplicación (por ejemplo, PHP) emplean ningún tipo de validación de juego de caracteres al completar la entrada. Si lo hicieran, el UTF8 no válido se eliminaría al llegar y mysql_escape_string nunca lo vería. , que por supuesto sería suficiente.

La verdadera respuesta:

No use mysql_escape_string (o mysql_whatever ) en absoluto. Han quedado en desuso y es posible que su código deje de funcionar. Utilice funciones PDO en su lugar.