PHP - Problema con apóstrofes (o inyección SQL)

 
Vista:

Problema con apóstrofes (o inyección SQL)

Publicado por Pablo (44 intervenciones) el 29/04/2019 14:11:32
Buenas tardes,

tengo un pequeño problema, quizá es o tiene que ver con la inyección SQL.

Al introducir un string, si este llava un apóstrofe me lanza este error:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's', '','Ford Focus')' at line 2

Cerca de la s es que el nombre que estaba introduciendo es Ricardo's (un nombre comercial)

¿Como puedo hacer que lo que introduzca en el campo (el string) vaya completo a la variable $_REQUEST['nombre_comercial'], contenga el string lo que contenga ?

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauro
Val: 2.761
Oro
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Problema con apóstrofes (o inyección SQL)

Publicado por Mauro (1036 intervenciones) el 29/04/2019 15:38:56
El problema no tiene que ver con inyección SQL, aunque la causa es similar: el string no está "escapado".

El tema es que el string "Ricardo's" contiene un apóstrofe (') y por lo tanto, tu string SQL se ve algo asi como:

1
INSERT INTO agencias (nombre, modelo) values ('Ricardo's', 'Ford Focus');
.

Si miras con atención notarás que el apóstrofe entre la o y la s cierra la sentencia SQL, con lo cual, todo lo que viene después no puede ser interpretado por el servidor...

Lo que debería decir es:

1
INSERT INTO agencias (nombre, modelo) values ('Ricardo\'s', 'Ford Focus');
.

Para no hacerlo manualmente está la función mysqli_real_escape_string

Mi recomendación es que uses PDO y si quieres ver un poco más sobre prevención de SQL injection puedes consultar aquí.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema con apóstrofes (o inyección SQL)

Publicado por Pablo (44 intervenciones) el 30/04/2019 16:07:32
Gracias por tu participación.

Estoy usando PDO (quizá erróneamente) ya que no soy un experto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
include('common.inc.php'); // Aqui están los parametros de usuario y contraseña.
 
try{
$conexion = new PDO("mysql:host=localhost;dbname=libro_de_entradas",$db_user,$db_pass);
} catch(PDOException $error_pdo){
	die('No se puede conectar con la base de datos: ' . $error_pdo->getMessage());
}
 
date_default_timezone_set('Europe/Madrid'); //Para que me de la hora española 
 
if(isset($_REQUEST['cliente'])){
	$entrada = date('Y-m-d H:i:s');
	$contacto = utf8_decode($_REQUEST['cliente']);
	$empresa = utf8_decode($_REQUEST['empresa']);
	$marca_modelo = $_REQUEST['marca_modelo'];
	$matricula = $_REQUEST['matricula'];
} else {
	echo "No se reciben datos";
}
 
$registro = "INSERT INTO registro_de_visitas(entrada,contacto,empresa,marca_modelo,matricula)
			VALUES ('$entrada', '$contacto', '$empresa', '$marca_modelo', '$matricula')";
 
$resultado = $conexion->query($registro);
 
if(!$resultado){
	$error_info = $conexion->errorInfo();
	die('No se puede ejecuatar la consulta porque: ' . $error_info[2]);
}
header("location: ../index.php");
exit;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 1.071
Bronce
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Problema con apóstrofes (o inyección SQL)

Publicado por Yamil (888 intervenciones) el 30/04/2019 16:17:16
En vez de usar un string dinamico, tendrias que usar un prepared statment. Seria algo como :

1
2
3
4
5
$stmt = $pdo->prepare("INSERT INTO registro_de_visitas(entrada,contacto,empresa,marca_modelo,matricula)
VALUES (?, ?, ?, ?, ?)");
 
$input = [ $entrada, $contacto, $empresa, $marca_modelo, $matricula];
$stmt->execute($input);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar