le 10/02/2014 à 22:51
Morganpog
Formulaire avec envoi BDD
le 11/02/2014 à 17:59
dragoon25
je partage le code complet , il reste encore à l'alléger.
Qu'en pensez vous ?
Qu'en pensez vous ?
<html>
<head>
<title>Formulaire de TEST</title>
<link href="styles.css" media="all" rel="stylesheet" type="text/css" />
</head>
<?php
//Valeurs du serveur SQL
$host = '127.0.0.1';
$user = 'root';
$pass = 'admin';
//Si l'action de validation a été faite
if(isset($_POST["Valider"]))
{
// On récupère les valeurs du formulaire
$societe = strtoupper($_POST ['societe']);
$nom = strtoupper($_POST['nom']);
$prenom = $_POST['prenom'];
$email = $_POST['email'];
$telephone = $_POST['telephone'];
//on vérifie les champs pour voir si ils ne sont pas vides
if (empty($_POST['societe']) ) {
$Erreur_societe = '<span class="erreur">Société manquante.</span>';
}
if
(empty($_POST['nom']) ) {
$Erreur_nom = '<span class="erreur">Nom manquant.</span>';
}
if
(empty($_POST['prenom']) ) {
$Erreur_prenom = '<span class="erreur">Prénom manquant.</span>';
}
if
(empty($_POST['email']) )
{
$Erreur_email = '<span class="erreur">Email manquant.</span>';
}
elseif (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
$Erreur_email1 = '<span class="erreur">Email invalide (@).</span>';
}
if
(empty($_POST['telephone']) )
{
$Erreur_telephone = '<span class="erreur">Téléphone manquant.</span>';
}
elseif (!preg_match("#^0[1-9][0-9]{8}$#", $telephone))
{
$Erreur_telephone1 = '<span class="erreur">Téléphone invalide (0xxxxxxxxx).</span>';
}
else{
}
// si tout les champs sont remplis (non vides), on continue.
if (($societe != "") && ($nom != "") && ($prenom != "") && ($email != "") && ($telephone != "") && preg_match("#^0[1-9][0-9]{8}$#", $telephone) && preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email))
{
// on se connecte au serveur
$link=mysql_connect ($host,$user,$pass);
if (!$link) {
die ('Erreur de connection au serveur '.mysql_error() ) ;
}
// on se connecte à la base de données
$db=mysql_select_db('Stammtisch');
if (!$db)
{
die ('Impossible de sélectionner la base de données : ' . mysql_error());
}
// on enregistre les valeurs
$table=mysql_query("insert into inscriptions (societe, nom, prenom, email, telephone) values ( '$societe' , '$nom' , '$prenom' , '$email' , '$telephone');");
//Si il y a une erreur
if (!$table) {
die('<p style="color:#ff0000;">Requête invalide :</p>' . mysql_error());
}
else
{
$succes = '<span class="succes">Merci de votre inscription.</span>';
}
}
}
?>
<body>
<center><img border="0" src="IMAGE.jpg" width="422" height="72"></font><br><br>
<?php if($succes !=""){ echo $succes;die("</center></body></html>");} ?>
<form id="formulaire" action="index.php" method="post"/>
<p><font color="#FFFFFF">Société:</font>
<input name="societe" size="22" value="<?echo $societe;?>" type="text"/><br />
<?php echo $Erreur_societe;?>
</p>
<p><font color="#FFFFFF">Nom:</font>
<input name="nom" size="22" value="<?echo $nom;?>" type="text"/><br />
<?php echo $Erreur_nom;?>
</p>
<p><font color="#FFFFFF">Prénom:</font>
<input name="prenom" size="22" value="<?echo $prenom;?>" type="text"/><br />
<?php echo $Erreur_prenom;?>
</p>
<p><font color="#FFFFFF">Email:</font>
<input name="email" size="22" value="<?echo $email;?>" type="text"/><br />
<?php echo $Erreur_email; echo $Erreur_email1;?>
</p>
<p><font color="#FFFFFF">Téléphone:</font>
<input name="telephone" size="22" value="<?echo $telephone;?>" type="text"/><br />
<?php echo $Erreur_telephone; echo $Erreur_telephone1; ?>
</p>
<br />
<input name="Valider" value="Valider" type="submit"/>
</form>
</center>
</body>
</html>
le 11/02/2014 à 18:26
Morganpog
le 11/02/2014 à 22:05
niconicochan
Salut,
Je reviens sur ce que je t'avais écris, car suite à mon mail il y a des points sur lesquels
il est préférable de faire attention.
Suite à mon dernier message, tu as écris:
<input name="societe" size="22" value="<?php echo @_$POST['societe'] ?>"" type="text"/>
Le signe $ n'est pas à la bonne place. Cette erreur d'un signe ne pardonne pas.
Il faut bien écrire:
<input name="societe" size="22" value="<?php echo @$_POST['societe'] ?>"" type="text"/>
Attention: dans tous tes champs value tu as une balise d'entrée <php? et une balise de sortie
?> puisque tu écris du code php entre les deux
Mais de très loin le plus important est ce que nous a dit LupusMic:
les données saisies par l'utilisateur doivent IMPERATIVEMENT être nettoyées.
Pour simplifier le propos j'ai évité d'aborder ce point en plus mais toi qui est en train d'écrire
le programme que tu vas utiliser il faut que tu te protèges d'utilisateurs mal intentionnés,
qui pourraient rentrer du code par tes champs de formulaire et mettre la pagaille dans
ton site (vider une de tes bases de données, ajouter des images indécentes dans ton site,...).
Ca, tu ne l'as pas encore fait et c'est primodial que tu le fasses maintenant au niveau de chacun
de tes champs value.
Pour cela, LupusMic te propose d'utiliser htmlentities.
Moi, j'aime bien travailler à la fois avec mysqli_real_escape_string(), strip_tags() et trim()
Je reviens sur ce que je t'avais écris, car suite à mon mail il y a des points sur lesquels
il est préférable de faire attention.
Suite à mon dernier message, tu as écris:
<input name="societe" size="22" value="<?php echo @_$POST['societe'] ?>"" type="text"/>
Le signe $ n'est pas à la bonne place. Cette erreur d'un signe ne pardonne pas.
Il faut bien écrire:
<input name="societe" size="22" value="<?php echo @$_POST['societe'] ?>"" type="text"/>
Attention: dans tous tes champs value tu as une balise d'entrée <php? et une balise de sortie
?> puisque tu écris du code php entre les deux
Mais de très loin le plus important est ce que nous a dit LupusMic:
les données saisies par l'utilisateur doivent IMPERATIVEMENT être nettoyées.
Pour simplifier le propos j'ai évité d'aborder ce point en plus mais toi qui est en train d'écrire
le programme que tu vas utiliser il faut que tu te protèges d'utilisateurs mal intentionnés,
qui pourraient rentrer du code par tes champs de formulaire et mettre la pagaille dans
ton site (vider une de tes bases de données, ajouter des images indécentes dans ton site,...).
Ca, tu ne l'as pas encore fait et c'est primodial que tu le fasses maintenant au niveau de chacun
de tes champs value.
Pour cela, LupusMic te propose d'utiliser htmlentities.
Moi, j'aime bien travailler à la fois avec mysqli_real_escape_string(), strip_tags() et trim()
le 12/02/2014 à 08:58
niconicochan
Sur le forum, LupusMic confirme que l'usage de mysqli_real_escape_string()
n'est pas possible car il doit être proche de ses camarades:
mysqli_connect() , mysqli_select_db(), mysqli_query(), ...
Dans value=" ...", (à la pace des trois points de suspension tu peux coder comme il propose:
Pour plus de sécurité, j'utiliserais à la fois htmlentities(), strip_tags() et trim(), de la façon suivante:
Mais s'il ne l'a pas fait, il y a peut-être une raison. Moi, je suis un débutant et serait d'ailleurs
ravi d'avoir l'avis des plus expérimentés à ce sujet ^ ^
J'aurais également une question basique, mais dont j'aimerais bien avoir quand même la réponse:
ici, le point virgule exprime bien à chaque fois la fin de l'instruction echo ?
Il est (en cela) absolument indispensable?
n'est pas possible car il doit être proche de ses camarades:
mysqli_connect() , mysqli_select_db(), mysqli_query(), ...
Dans value=" ...", (à la pace des trois points de suspension tu peux coder comme il propose:
<?php echo htmlentities(@$_POST['societe'], ENT_QUOTES); ?>
<?php echo htmlentities(@$_POST['nom'], ENT_QUOTES); ?>
<?php echo htmlentities(@$_POST['prenom'], ENT_QUOTES); ?>
<?php echo htmlentities(@$_POST['email'], ENT_QUOTES); ?>
<?php echo htmlentities(@$_POST['telephone'], ENT_QUOTES); ?>
Pour plus de sécurité, j'utiliserais à la fois htmlentities(), strip_tags() et trim(), de la façon suivante:
<?php echo htmlentities(strip_tags(trim(@$_POST['societe'], ENT_QUOTES))); ?>
<?php echo htmlentities(strip_tags(trim(@$_POST['nom'], ENT_QUOTES))); ?>
<?php echo htmlentities(strip_tags(trim(@$_POST['prenom'], ENT_QUOTES))); ?>
<?php echo htmlentities(strip_tags(trim(@$_POST['email'], ENT_QUOTES))); ?>
<?php echo htmlentities(strip_tags(trim(@$_POST['telephone'], ENT_QUOTES))); ?>
Mais s'il ne l'a pas fait, il y a peut-être une raison. Moi, je suis un débutant et serait d'ailleurs
ravi d'avoir l'avis des plus expérimentés à ce sujet ^ ^
J'aurais également une question basique, mais dont j'aimerais bien avoir quand même la réponse:
ici, le point virgule exprime bien à chaque fois la fin de l'instruction echo ?
Il est (en cela) absolument indispensable?
le 12/02/2014 à 09:14
dragoon25
Merci ninonicochan j'ai fais la modif comme ceci :
Merci Morganpog , ta modif est plus claire et plus carrée que ce que j'avais fais.
Pour la sécurisation , j'avais fais cela mais retirer en attendant de terminer le formulaire. ( étant sur mon serveur nas je risque rie npour le moment )
<input name="societe" size="22" value="<?php echo @$_POST['societe'];?>" type="text"/>
Merci Morganpog , ta modif est plus claire et plus carrée que ce que j'avais fais.
Pour la sécurisation , j'avais fais cela mais retirer en attendant de terminer le formulaire. ( étant sur mon serveur nas je risque rie npour le moment )
$societe = mysql_real_escape_string(htmlspecialchars(stripcslashes($_POST["societe"])));
le 12/02/2014 à 09:45
niconicochan
Je ne sais pas si le fait de dédier le nettoyage des données à une variable spécifique permet du coup
l'usage de mysqli_real_escape_string()
Je pense que htmlentities est préférable à htmlspecialchars car il concerne tous les caractères
ayant un équivalent en html, notamment les caractères accentués.
Pour optimiser la sécurité, j'écrirais donc:
J'espère que des personnes plus confirmées pourront prendre le relais pour apporter plus de précisions
sur le nettoyage de données et la sécurité.
Si ces subtilitées dans mon message peuvent sembler être du détail, ça m'intéressait beaucoup d'avoir vos avis.
J'apprendrai ainsi avec dragoon25
l'usage de mysqli_real_escape_string()
Je pense que htmlentities est préférable à htmlspecialchars car il concerne tous les caractères
ayant un équivalent en html, notamment les caractères accentués.
Pour optimiser la sécurité, j'écrirais donc:
$societe = mysqli_real_escape_string(htmlentities(strip_tags(trim(stripcslashes($_POST["societe"])))));
J'espère que des personnes plus confirmées pourront prendre le relais pour apporter plus de précisions
sur le nettoyage de données et la sécurité.
Si ces subtilitées dans mon message peuvent sembler être du détail, ça m'intéressait beaucoup d'avoir vos avis.
J'apprendrai ainsi avec dragoon25
le 12/02/2014 à 12:02
LupusMic
Pour optimiser la sécurité, j'écrirais donc:
$societe = mysqli_real_escape_string(htmlentities(strip_tags(trim(stripcslashes($_POST["societe"])))));
$societe = mysqli_real_escape_string(htmlentities(strip_tags(trim(stripcslashes($_POST["societe"])))));
Ralalalalala.
Pour foutre le bordel, c'est ce qu'il faut faire. Ce que tu proposes introduit des bogues. Il faut protéger les données au moment où elles sont propulsées d'un domaine à un autre. Le faire à un endroit unique, c'est vivre dans l'illusion de la sécurité, et introduire des bogues incompréhensibles (mais pourquoi diable mon PDF contiens des & ? ;) ).
strip_tags n'est pas complet, car il ne propose qu'un ensemble limité de tags liés à HTML 4. Et puis, ça ne nettoie pas les problèmes les plus graves. htmlentities suffit quand on projette des données dans un document HTML.
trim n'est là que pour le confort de l'utilisateur.
Ce qui est vraiment préférable, c'est de créer des fonctions qui s'occupent de passer les données d'un domaine à l'autre, et de toujours être conscient des limitations de chaque domaine.
le 12/02/2014 à 12:44
niconicochan
Concrètement, tu coderais donc comment pour la création des fonctions et celle des variables de nettoyage?
le 12/02/2014 à 13:13
LupusMic
Je l'ai exposé à de nombreuses reprises, mais en gros :
http://www.lephpfacile.com/forum/1-php-mysql/7575-probleme-mise-a-jour-bdd
http://www.lephpfacile.com/forum/1-php-mysql/7554-minisite-avec-tableau-multidimensionnel
http://www.lephpfacile.com/forum/1-php-mysql/7575-probleme-mise-a-jour-bdd
http://www.lephpfacile.com/forum/1-php-mysql/7554-minisite-avec-tableau-multidimensionnel