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

PHP ¿Cuál es el conjunto de caracteres predeterminado para pdo mysql?

La opción character_set_client es lo que utiliza MySQL para el conjunto de caracteres de consultas y datos que envía el cliente.

El valor predeterminado es utf8 en MySQL 5.5, 5.6 y 5.7, y utf8mb4 en 8.0.

También se puede cambiar globalmente en su archivo de opciones my.cnf, o por sesión mediante un ESTABLECER NOMBRES declaración.

Es bueno configurar la opción explícitamente cuando se conecta, para que no tenga que asumir su valor predeterminado.

Re tu comentario:

Me temo que está confundiendo dos casos diferentes de inyección de SQL. Existe un riesgo al usar esos conjuntos de cinco caracteres específicos, pero no está relacionado con la inyección SQL de segundo orden.

El riesgo del juego de caracteres se debe a algunos juegos de caracteres de varios bytes. Es común insertar una barra invertida para escapar de un carácter de comilla literal. Pero en algunos conjuntos de caracteres, el byte de barra invertida se fusiona con el byte anterior, formando un carácter de varios bytes. Eso deja la cita sin escape.

La inyección SQL de segundo orden es totalmente diferente. Puede ocurrir con cualquier conjunto de caracteres. Esto es cuando un atacante agrega datos a su base de datos a través de medios legítimos, como completar un formulario. La inserción de los datos se maneja sin errores. Pero los valores que insertan contienen una sintaxis diseñada para explotar alguna consulta SQL posterior.

Se basa en que los desarrolladores crean que los datos que ya se han guardado de forma segura en su base de datos son de alguna manera "seguros" para su uso sin la parametrización adecuada.

Un ejemplo de inyección SQL de segundo orden que es meramente accidental en lugar de maliciosa podría ser que una persona tenga el apellido "O'Reilly" y el código lea el nombre y lo use en una consulta posterior.

$name = $db->query("SELECT last_name FROM people WHERE id = 123")->fetchColumn();
$sql = "SELECT * FROM accounts WHERE account_owner_last_name = '$name'";

Si el nombre contiene un apóstrofe literal, estropearía la segunda consulta en ese ejemplo.