[PHP] [MYSQL] Problème insertion BDD

Petit nouveau ! | 1 Messages

14 févr. 2017, 11:25

Bonjour,

Je ne suis pas développeur mais je dois effectuer un très simple formulaire qui insère des données dans ma BDD (donc relativement très très simple :))

Petit problème que je n'avais pas eu lors d'autres tests sur des trucs perso : si mon visiteur insère un ' dans un champ, aucune insertion se fait dans la bdd. En lisant des tutos j'ai cru comprendre que la fonction "htmlspecialchars" pouvait résoudre ce problème.

Or ca ne marche pas et meme si je ne mets pas de ' l'insertion ne se fait pas.

Une erreur de syntaxe ?

Voici ma page de traitement en php :
<?php

$var1 = htmlspecialchars($_POST['raison']);
$var2 = htmlspecialchars($_POST['adresse']);
$var3 = htmlspecialchars($_POST['contact']);
$var3 = htmlspecialchars($_POST['ville']);
$var4 = htmlspecialchars($_POST['tel']);
$var5 = htmlspecialchars($_POST['etage']);
$var6 = htmlspecialchars($_POST['elec']);
$var7 = htmlspecialchars($_POST['ether']);
$var8 = htmlspecialchars($_POST['ip']);
$var9 = htmlspecialchars($_POST['sel1']);
$var10 = htmlspecialchars($_POST['scan']);
$var11 = htmlspecialchars($_POST['scanmail']);
$var12 = htmlspecialchars($_POST['os']);
$var13 = htmlspecialchars($_POST['nombre']);
$var14 = htmlspecialchars($_POST['mailfai']);
$var15 = htmlspecialchars($_POST['smtp']);


$conn = mysqli_connect("localhost","root","root","app");
if (mysqli_connect_errno()) {
    printf("Échec de la connexion : %s\n", mysqli_connect_error());
    exit();
}
$req = $conn->query("INSERT INTO donnees (raison, adresse, ville, contact, tel, etage, elec, ether, ip, sel1, scan, scanmail, os, nombre, mailfai, smtp) VALUES( $var1, $var2, $var3, $var4, $var5, $var6, $var7, $var8, $var9, $var10, $var11, $var12, $var13, $var14, $var15)");

?>

<?php
   header('Location: succes.php');      
?>

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

14 févr. 2017, 15:39

salut,

lit bien la doc de htmlspecialchars et tu devrais comprendre pourquoi cela ne fonctionne pas ;)

il est impératif d'activer les rapport d'erreur de php en développement : (dans le php.ini)
error_reporting = E_ALL
display_error = On

ta requêtes est très bien, pour une injection SQL. tu l'indique d'ailleurs en posant ta question.

Il ne faut pas utiliser les variables ainsi utilise des noms correctes ($var12 => $smtp), cela va permettre d'avoir une idée clair de ce a quoi sert la variable lorsqu'elle est rencontrée dans le script.

tu ne délimites pas les valeurs des champs par des ' => tu n'as donc que des entiers ?

vu comme sa ta requête ne peux pas fonctionner, d'ailleurs tu as mélanger les champs ce qui fait que seul raison et adresse son correct, tu l'aurais vu avec des noms parlant ;) .

ton code en utilisant mysqli_real_escape_string
<?php
$conn = mysqli_connect('localhost','root','root','app');
if (mysqli_connect_errno()) {
    printf('Échec de la connexion : %s\n', mysqli_connect_error());
    exit();
}

$raison = real_escape_string($conn,$_POST['raison']);
$adresse = real_escape_string($conn,$_POST['adresse']);
$contact = real_escape_string($conn,$_POST['contact']);
$ville = real_escape_string($conn,$_POST['ville']);
$tel = real_escape_string($conn,$_POST['tel']);
$etage = real_escape_string($conn,$_POST['etage']);
$elec = real_escape_string($conn,$_POST['elec']);
$ether = real_escape_string($conn,$_POST['ether']);
$ip = real_escape_string($conn,$_POST['ip']);
$sel1 = real_escape_string($conn,$_POST['sel1']);
$scan = real_escape_string($conn,$_POST['scan']);
$scanmail = real_escape_string($conn,$_POST['scanmail']);
$os = real_escape_string($conn,$_POST['os']);
$nombre = real_escape_string($conn,$_POST['nombre']);
$mailfai = real_escape_string($conn,$_POST['mailfai']);
$smtp = real_escape_string($conn,$_POST['smtp']);

$req = $conn->query('INSERT INTO donnees (raison, adresse, ville, contact, tel, etage, elec, ether, ip, sel1, scan, scanmail, os, nombre, mailfai, smtp) VALUES(
                                          \''.$raison.'\',\''.$adresse.'\',\''.$ville.'\',\''.$contact.'\',\''.$tel.'\',\''.$etage.'\',\''.$elec.'\',\''.$ether.'\',\''.$ip.'\',\''.$sel1.'\',\''.$scan.'\',
                                          \''.$scanmail.'\',\''.$os.'\',\''.$nombre.'\',\''.$mailfai.'\',\''.$smtp.'\')');
// a commenter pour tester
 header('Location: succes.php');
Il est aussi possible d'utiliser une requête préparée bien qu'ici elle soit inutile.
<?php
$conn = mysqli_connect('localhost','root','root','app');
if (mysqli_connect_errno()) {
    printf('Échec de la connexion : %s\n', mysqli_connect_error());
    exit();
}

$raison = real_escape_string($conn,$_POST['raison']);
$adresse = real_escape_string($conn,$_POST['adresse']);
$contact = real_escape_string($conn,$_POST['contact']);
$ville = real_escape_string($conn,$_POST['ville']);
$tel = real_escape_string($conn,$_POST['tel']);
$etage = real_escape_string($conn,$_POST['etage']);
$elec = real_escape_string($conn,$_POST['elec']);
$ether = real_escape_string($conn,$_POST['ether']);
$ip = real_escape_string($conn,$_POST['ip']);
$sel1 = real_escape_string($conn,$_POST['sel1']);
$scan = real_escape_string($conn,$_POST['scan']);
$scanmail = real_escape_string($conn,$_POST['scanmail']);
$os = real_escape_string($conn,$_POST['os']);
$nombre = real_escape_string($conn,$_POST['nombre']);
$mailfai = real_escape_string($conn,$_POST['mailfai']);
$smtp = real_escape_string($conn,$_POST['smtp']);

$req = $conn->prepare('INSERT INTO donnees (raison, adresse, ville, contact, tel, etage, elec, ether, ip, sel1, scan, scanmail, os, nombre, mailfai, smtp) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');

mysqli_stmt_bind_param($req,'ssssssssssssssss',$raison,$adresse,$ville,$contact,$tel,$etage,$elec,$ether,$ip,$sel1,$scan,$scanmail,$os,$nombre,$mailfai,$smtp);
mysqli_stmt_execute($req);
mysqli_stmt_close($req);
La doc pour le bind http://php.net/manual/fr/mysqli-stmt.bind-param.php

Si tu veux utiliser des requêtes préparer de façon plus simple, ou utiliser un style plus orienté objet, utilise PDO

@+
Il en faut peu pour être heureux ......

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 7375 Messages

14 févr. 2017, 17:52

ton code en utilisant mysqli_real_escape_string
<?php
$conn = mysqli_connect('localhost','root','root','app');
if (mysqli_connect_errno()) {
    printf('Échec de la connexion : %s\n', mysqli_connect_error());
    exit();
}

$raison = real_escape_string($conn,$_POST['raison']);
@moogli : il manque l'objet mysqli dans tes exemples, non ?
$raison = $conn->real_escape_string($conn,$_POST['raison']);
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

15 févr. 2017, 12:20

nan il manque juste mysqli dans $raison = mysqli_real_escape_string($conn,$_POST['raison']);

en plus c'est con je met le lien vers la fonction au dessus :'(

corrections
<?php
$conn = mysqli_connect('localhost','root','root','app');
if (mysqli_connect_errno()) {
    printf('Échec de la connexion : %s\n', mysqli_connect_error());
    exit();
}

$raison = mysqli_real_escape_string($conn,$_POST['raison']);
$adresse = mysqli_real_escape_string($conn,$_POST['adresse']);
$contact = mysqli_real_escape_string($conn,$_POST['contact']);
$ville = mysqli_real_escape_string($conn,$_POST['ville']);
$tel = mysqli_real_escape_string($conn,$_POST['tel']);
$etage = mysqli_real_escape_string($conn,$_POST['etage']);
$elec = mysqli_real_escape_string($conn,$_POST['elec']);
$ether = mysqli_real_escape_string($conn,$_POST['ether']);
$ip = mysqli_real_escape_string($conn,$_POST['ip']);
$sel1 = mysqli_real_escape_string($conn,$_POST['sel1']);
$scan = mysqli_real_escape_string($conn,$_POST['scan']);
$scanmail = mysqli_real_escape_string($conn,$_POST['scanmail']);
$os = mysqli_real_escape_string($conn,$_POST['os']);
$nombre = mysqli_real_escape_string($conn,$_POST['nombre']);
$mailfai = mysqli_real_escape_string($conn,$_POST['mailfai']);
$smtp = mysqli_real_escape_string($conn,$_POST['smtp']);

$req = $conn->query('INSERT INTO donnees (raison, adresse, ville, contact, tel, etage, elec, ether, ip, sel1, scan, scanmail, os, nombre, mailfai, smtp) VALUES(
                                          \''.$raison.'\',\''.$adresse.'\',\''.$ville.'\',\''.$contact.'\',\''.$tel.'\',\''.$etage.'\',\''.$elec.'\',\''.$ether.'\',\''.$ip.'\',\''.$sel1.'\',\''.$scan.'\',
                                          \''.$scanmail.'\',\''.$os.'\',\''.$nombre.'\',\''.$mailfai.'\',\''.$smtp.'\')');
// a commenter pour tester
 header('Location: succes.php');
et la version requête préparée :
<?php
$conn = mysqli_connect('localhost','root','root','app');
if (mysqli_connect_errno()) {
    printf('Échec de la connexion : %s\n', mysqli_connect_error());
    exit();
}

$raison = mysqli_real_escape_string($conn,$_POST['raison']);
$adresse = mysqli_real_escape_string($conn,$_POST['adresse']);
$contact = mysqli_real_escape_string($conn,$_POST['contact']);
$ville = mysqli_real_escape_string($conn,$_POST['ville']);
$tel = mysqli_real_escape_string($conn,$_POST['tel']);
$etage = mysqli_real_escape_string($conn,$_POST['etage']);
$elec = mysqli_real_escape_string($conn,$_POST['elec']);
$ether = mysqli_real_escape_string($conn,$_POST['ether']);
$ip = mysqli_real_escape_string($conn,$_POST['ip']);
$sel1 = mysqli_real_escape_string($conn,$_POST['sel1']);
$scan = mysqli_real_escape_string($conn,$_POST['scan']);
$scanmail = mysqli_real_escape_string($conn,$_POST['scanmail']);
$os = mysqli_real_escape_string($conn,$_POST['os']);
$nombre = mysqli_real_escape_string($conn,$_POST['nombre']);
$mailfai = mysqli_real_escape_string($conn,$_POST['mailfai']);
$smtp = mysqli_real_escape_string($conn,$_POST['smtp']);

$req = $conn->prepare('INSERT INTO donnees (raison, adresse, ville, contact, tel, etage, elec, ether, ip, sel1, scan, scanmail, os, nombre, mailfai, smtp) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)');

mysqli_stmt_bind_param($req,'ssssssssssssssss',$raison,$adresse,$ville,$contact,$tel,$etage,$elec,$ether,$ip,$sel1,$scan,$scanmail,$os,$nombre,$mailfai,$smtp);
mysqli_stmt_execute($req);
mysqli_stmt_close($req);

ceci dit c'est quand même moche mysqli :mrgreen:

merci d'avoir relevé

@+
Il en faut peu pour être heureux ......