Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[DEBUTANT] critiquez mon petit code !

25 réponses
Avatar
Laurent
Bonjour

Je suis débutant complet en html et php...(amateur)
C'est un exercice que je me suis inventé après quelques autres plus
simples.
je veux vendre 4 articles à des prix définis à l'avance sur le net. Je
demande le nom prénom email et la quantité d'articles. je valide et ça
me récapitule ma commande avec le total.
je selectionne mon mode de paiement et ensuite je confirme la commande
ce qui a pour but d'envoyer un email au webmestre du site avec la
commande complète.

Je pense que mon code HTML est trop lourd (du à frontpage) et
optimisable... mais bon ça, à la limite, je m'en fous un peu...

c'est surtout le php que je voudrais optimiser. Je vois plusieurs
défauts :
- c'est redondant dans les passages de variables, il y a surement un
moyen de faire mieux pour que les variables soient connues sur les 3
pages?
- c'est pas sécurisé surement, je crois qu'on peut bidouiller dans les
champs, et il faut mettre un truc (mais quoi? ) pour éviter que? que
pourrait il arriver d'ailleurs?
- le code est surement extremement maladroit, est il bien présenté?
- j'aurai voulu rajouter un bouton sur la 2eme page: "modifier la
commande" , si ce n'est pas correct revenir à l'ancienne page
saisie.php avec les champs préremplis pour modif , comment faire?
- faut il prendre l'habitude de séparer le code HTML du code PHP sur 2
fichiers différents, j'ai vu ça sur des cours de fac (formulaires,
traitement)
- j'ai essayé de pomper une fonction verifier en javascript mais ça
marche pas, je n'ai jamais fait de javascript. comment vérifier que le
champs a bien été saisi et bloquer l'envoi dans le cas contraire?
comment détecter que l'email est bien de la forme xxxx@xxxx.xx ?

Est ce que vous pourriez vous pencher sur ce code pour émettre le
maximum de critiques afin que je ne prenne pas trop de mauvaises
habitudes?

MERCI BEAUCOUP !!!!

PS: le programme tourne ici :

http://membres.lycos.fr/psylyon/saisie.php (j'ai désactivé l'envoi de
mail)

------------------------------------------------------------------------------------------------------------------------
saisie.php

<? session_start(); // démarrage session ?>

<html>

<head>
<SCRIPT language="javascript">
function verifer()
{
var nom=document.saisie.nom.value

if (nom="") alert("Entrez votre nom !");
}
</SCRIPT>
<meta http-equiv="Content-Language" content="fr">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>BON DE COMMANDE</title>
<meta name="Microsoft Theme" content="sumipntg 001, default">
<meta name="Microsoft Border" content="tl, default">
</head>

<body background="sumtextb.jpg" bgcolor="#FFFFFF" text="#000066"
link="#3333CC" vlink="#666699" alink="#990099">

<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>

<h1 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">BON DE COMMANDE<!--mstheme--></font></h1>
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center">&nbsp;</p>
<p align="center">&nbsp;</p>



<? // on définit ici les prix unitaires de chaque article

$_SESSION['PU1']=2.65; $PU1=$_SESSION['PU1'];
$_SESSION['PU2']=3.63; $PU2=$_SESSION['PU2'];
$_SESSION['PU3']=5.74; $PU3=$_SESSION['PU3'];
$_SESSION['PU4']=1.27; $PU4=$_SESSION['PU4'];

// on définit le nom des articles
$_SESSION['article1']="article N°1" ;
$article1=$_SESSION['article1'];
$_SESSION['article2']="article N°2" ;
$article2=$_SESSION['article2'];
$_SESSION['article3']="article N°3" ;
$article3=$_SESSION['article3'];
$_SESSION['article4']="article N°4" ;
$article4=$_SESSION['article4'];

?>

<FORM ACTION="validation.php" METHOD="post">

<!--mstheme--></font>

<h5 align="left"><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366">Nom: <input type="text" name="nom"
size="36"><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left"><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366">prénom: <input type="text" name="prenom"
size="33"><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left"><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366">Adresse email: <input type="text" name="email"
size="26"><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="left">&nbsp;</p>
<!--mstheme--></font>
<table border="1" cellpadding="0" cellspacing="0"
style="border-collapse: collapse" width="76%" id="AutoNumber1"
height="155" bordercolorlight="#C0C0C0" bordercolordark="#003366">
<tr>
<td width="59%" height="22">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">ARTICLE<!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="11%" height="22">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">Quantité<!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="37%" height="22">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">prix unitaire<!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
</tr>
<tr>
<td width="59%" height="18" align="left">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366"><? echo $article1 ?><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="11%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<input type="text" name="quantite1" size="8"></p>
<!--mstheme--></font>
</td>
<td width="37%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><? echo $PU1; ?><!--mstheme--></font></td>
</tr>
<tr>
<td width="59%" height="18" align="left">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366"><? echo $article2 ?><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="11%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><input type="text" name="quantite2"
size="8"><!--mstheme--></font></td>
<td width="37%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><? echo $PU2; ?><!--mstheme--></font></td>
</tr>
<tr>
<td width="59%" height="18" align="left">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366"><? echo $article3 ?><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="11%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><input type="text" name="quantite3"
size="8"><!--mstheme--></font></td>
<td width="37%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><? echo $PU3; ?><!--mstheme--></font></td>
</tr>
<tr>
<td width="59%" height="18" align="left">
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366"><? echo $article4 ?><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
</td>
<td width="11%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><input type="text" name="quantite4"
size="8"><!--mstheme--></font></td>
<td width="37%" height="18">
<!--mstheme--><font face="Verdana, Arial, Helvetica">
<p align="center"><? echo $PU4; ?><!--mstheme--></font></td>
</tr>
</table>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left"><!--mstheme--><font face="Verdana, Arial, Helvetica"
color="#003366">Je préfère payer par :
<!--mstheme--></font> </h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left">
<!--mstheme--><font face="Verdana, Arial, Helvetica" color="#003366">
<input type="radio" value="cheque" checked name="paiement"> Chèque (à
réception)<!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left">
<!--mstheme--><font face="Verdana, Arial, Helvetica" color="#003366">
<input type="radio" value="paypal" name="paiement"> Paypal (livraison
immédiate)&nbsp;
<!--mstheme--></font> </h5>
<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<h5 align="left">
<!--mstheme--><font face="Verdana, Arial, Helvetica" color="#003366">
<input type="radio" value="mandat" name="paiement"> Mandat (à
réception)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" value="Valider" name="B1"
onclick="verifier()"><!--mstheme--></font></h5>
<!--mstheme--><font face="Verdana, Arial, Helvetica">
</form>

<!--mstheme--></font>
</body>

</html>

------------------------------------------------------------------------------------------------------------------------
traitement.php

<? session_start(); // démarrage session ?>

<html>

<HEAD>
<meta http-equiv="Content-Language" content="fr">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>BON DE COMMANDE</title>
<meta name="Microsoft Theme" content="sumipntg 001, default">
<meta name="Microsoft Border" content="tl, default">
</HEAD>

<body background="sumtextb.jpg" bgcolor="#FFFFFF" text="#000066"
link="#3333CC" vlink="#666699" alink="#990099">

<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>


<h2 align="center">Récapitulatif de votre commande</h2>
<h5>

<? $Q1=$_POST["quantite1"] ; $_SESSION['Q1']=$Q1; // on récupère
les quantités définies à la page de saisie
$Q2=$_POST["quantite2"] ; $_SESSION['Q2']=$Q2;
$Q3=$_POST["quantite3"] ; $_SESSION['Q3']=$Q3;
$Q4=$_POST["quantite4"] ; $_SESSION['Q4']=$Q4;

$nom=$_POST['nom'] ; $_SESSION['nom']=$nom; // on récupère
les infos persos définies à la page de saisie
$prenom= $_POST['prenom'] ;$_SESSION['prenom']=$prenom;
$email= $_POST['email'] ; $_SESSION['email']=$email;
$PU1= $_SESSION['PU1']; // on récupère les prix unitaires
définis à la page de saisie
$PU2= $_SESSION['PU2'];
$PU3= $_SESSION['PU3'];
$PU4= $_SESSION['PU4'];

$article1=$_SESSION['article1']; // on récupère les noms des
articles
$article2=$_SESSION['article2'];
$article3=$_SESSION['article3'];
$article4=$_SESSION['article4'];

$Prix1= $Q1 *$PU1 ; $_SESSION['prix1']=$Prix1 ; // on
calcule les prix pour chaque quantité
$Prix2= $Q2 *$PU2 ; $_SESSION['prix2']=$Prix2 ;
$Prix3= $Q3 *$PU3 ; $_SESSION['prix3']=$Prix3 ;
$Prix4= $Q4 *$PU4 ; $_SESSION['prix4']=$Prix4 ;

$total=$Prix1+$Prix2+$Prix3+$Prix4 ;
$_SESSION['total']=$total;

$paiement=$_POST['paiement'] ;$_SESSION['paiement']=$paiement;
// on récupère le mode de paiement
?>
<h4>
<? echo "Commande de ".$prenom." "."$nom"." email: ".$email
;?>
<br><br>
<? echo "paiement par ".$paiement ;?>
</h4>



<table border="1" cellpadding="0" cellspacing="0"
style="border-collapse: collapse" width="81%" id="AutoNumber1"
height="155">
<tr>
<td width="61%" height="22">

<h5 align="center">ARTICLE
</td>
<td width="11%" height="22">
<h5 align="center">Quantité
</td>
<td width="15%" height="22">
<h5 align="center">prix unitaire
</td>
<td width="44%" height="22">
<h5 align="center">prix TTC
</td>
</tr>
<tr>
<td width="61%" height="18" align="left">
<h5><? echo $article1 ?>
</td>
<td width="11%" height="18">
<h5 align="center"><? echo $Q1 ; ?></td>
<td width="15%" height="18">

<h5 align="center"><? echo $PU1 ;?></td>
<td width="44%" height="18">

<h5 align="center"><? echo $Prix1 ;?> </td>
</tr>
<tr>
<td width="61%" height="18" align="left">

<h5><? echo $article2 ?>
</td>
<td width="11%" height="18">
<h5 align="center"><? echo $Q2 ; ?></td>
<td width="15%" height="18">

<h5 align="center"><? echo $PU2 ;?></td>
<td width="44%" height="18">

<h5 align="center"><? echo $Prix2 ;?> </td>
</tr>
<tr>
<td width="61%" height="18" align="left">

<h5><? echo $article3 ?>
</td>
<td width="11%" height="18">
<h5 align="center"> <? echo $Q3 ; ?></td>
<td width="15%" height="18">

<h5 align="center"><? echo $PU3 ;?></td>
<td width="44%" height="18">

<h5 align="center"><? echo $Prix3 ;?> </td>
</tr>
<tr>
<td width="61%" height="18" align="left">

<h5><? echo $article4 ?>
</td>
<td width="11%" height="18">
<h5 align="center"><? echo $Q4 ; ?></td>
<td width="15%" height="18">

<h5 align="center"><? echo $PU4 ;?></td>
<td width="44%" height="18">

<h5 align="center"><? echo $Prix4 ;?> </td>
<td width="44%" height="18">
</tr>
<tr>
<td width="61%" height="18" align="left">

<h5>TOTAL
</td>
<td width="11%" height="18">
<h5 align="center"> </td>
<td width="15%" height="18">

<h5 align="center"> </td>
<td width="44%" height="18">

<h5 align="center"><? echo $total ;?> </td>
<td width="44%" height="18">
</tr>

</table>
<br>
<form ACTION="confirmation.php" METHOD="GET">
<DIV align="center">
<input type="submit" value="Valider la commande"
name="B1"><!--mstheme--></font></h5>


</body>

</html>

------------------------------------------------------------------------------------------------------------------------

<? session_start(); // démarrage session ?>

<html>

<head>

<meta http-equiv="Content-Language" content="fr">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>BON DE COMMANDE</title>
<meta name="Microsoft Theme" content="sumipntg 001, default">
<meta name="Microsoft Border" content="tl, default">
</head>

<body background="sumtextb.jpg" bgcolor="#FFFFFF" text="#000066"
link="#3333CC" vlink="#666699" alink="#990099">

<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>
<br><br><br>
<h2> Merci. Votre commande a bien été envoyée! </h2>

<?

$Q1=$_SESSION['Q1'] ; // on récupère les quantités définies à
la page de saisie
$Q2=$_SESSION['Q2'] ;
$Q3=$_SESSION['Q3'] ;
$Q4=$_SESSION['Q4'] ;

$nom=$_SESSION['nom'] ; // on récupère les infos persos
définies à la page de saisie
$prenom=$_SESSION['prenom'] ;
$email= $_SESSION['email'];
$PU1= $_SESSION['PU1']; // on récupère les prix unitaires
définis à la page de saisie
$PU2= $_SESSION['PU2'];
$PU3= $_SESSION['PU3'];
$PU4= $_SESSION['PU4'];

$Prix1= $_SESSION['prix1'] ; // on calcule les prix
pour chaque quantité
$Prix2= $_SESSION['prix2'] ;
$Prix3= $_SESSION['prix3'] ;
$Prix4= $_SESSION['prix4'] ;
$total=$_SESSION['total'];

$article1=$_SESSION['article1']; // on récupère les noms des
articles
$article2=$_SESSION['article2'];
$article3=$_SESSION['article3'];
$article4=$_SESSION['article4'];

$paiement=$_SESSION['paiement']; // mode de paiement

// création du message à envoyer au webmestre:

$msg = "Bonjour \n\n vous avez une nouvelle vente de : " ;
$msg.= $prenom." ".$nom." "." \t Email: ".$email." \n" ;
$msg.= "paiement par ".$paiement." \n \n \n" ;
$msg.= "\n".$article1."\t \t ".$Q1."\t exemplaire(s) \t \t ".$Prix1."
€";
$msg.= "\n".$article2."\t \t ".$Q2."\t exemplaire(s) \t \t ".$Prix2."
€";
$msg.= "\n".$article3."\t \t ".$Q3."\t exemplaire(s) \t \t ".$Prix3."
€";
$msg.= "\n".$article4."\t \t ".$Q4."\t exemplaire(s) \t \t ".$Prix4."
€";
$msg.="\n\nMontant de la vente: \t \t \t \t \t ".$total." €";


// création des entetes, destinaraire,sujet du message à
envoyer au webmestre
$mailheaders = "From: mon site web <> \n";
$mailheaders .= "Reply-To: $email\n\n";
$destinataire = "monemail@wanadoo.fr";
$sujet = "Une nouvelle commande via mon site web !";
mail($destinataire, $sujet, $msg, $mailheaders);
?>

-----------------------------------------------------------------------------------------------------------------------
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp

10 réponses

1 2 3
Avatar
Olivier Miakinen
Bonjour,


Je suis débutant complet en html et php...(amateur)


Bienvenue chez les fous. ©

je veux vendre 4 articles à des prix définis à l'avance sur le net. Je
demande le nom prénom email et la quantité d'articles. je valide et ça
me récapitule ma commande avec le total.
je selectionne mon mode de paiement et ensuite je confirme la commande


Ouf, c'est en effet assez ambitieux pour un débutant complet.

ce qui a pour but d'envoyer un email au webmestre du site avec la
commande complète.


Aïe aïe aïe... je n'ai pas encore lu ton code, mais je regarderai tout
particulièrement cette partie. Je dirais à priori que tu as plus de 99 %
de chances d'avoir fait un relais à spam.

Je pense que mon code HTML est trop lourd (du à frontpage) et
optimisable... mais bon ça, à la limite, je m'en fous un peu...


Frontpage n'est peut-être pas le meilleur outil pour faire des pages
html. Ce n'est pas le pire non plus parce qu'il y a Windows Word qui
le bat assurément...

- c'est pas sécurisé surement, je crois qu'on peut bidouiller dans les
champs, et il faut mettre un truc (mais quoi? ) pour éviter que? que
pourrait il arriver d'ailleurs?


Il peut arriver plein de choses si tu ne vérifies pas attentivement ce
que tu fais des paramètres qui viennent de l'extérieur, par exemple une
corruption de ta base de données si tu en utilises, ou l'effacement de
tous les fichiers de ton serveur, ou encore l'utilisation de ton script
pour aller spammer la terre entière en toute impunité.

- faut il prendre l'habitude de séparer le code HTML du code PHP sur 2
fichiers différents, j'ai vu ça sur des cours de fac (formulaires,
traitement)


Ça me semble difficile à réaliser en totalité. En tout cas je ne me
prononcerai pas sur le sujet.

- j'ai essayé de pomper une fonction verifier en javascript mais ça
marche pas, je n'ai jamais fait de javascript. comment vérifier que le
champs a bien été saisi et bloquer l'envoi dans le cas contraire?


Tu dois d'abord faire toutes les vérifications en PHP puisque
l'utilisateur peut fort bien désactiver toute fonction JavaScript,
ou bien les adapter selon son goût.

Ensuite tu pourras rajouter un peu de code JavaScript dans la partie
« statique » (c.-à-d. HTML pur) mais la question sera en charte dans
fr.comp.lang.javascript, pas ici.

comment détecter que l'email est bien de la forme ?


http://faqfclphp.free.fr/#rub5.3

http://membres.lycos.fr/psylyon/saisie.php


:-(

J'ai rarement vu des publicités aussi intrusives que celles de Lycos.
Bon, j'irai peut-être voir, mais en désactivant JavaScript.

(j'ai désactivé l'envoi de mail)


Ceci est une *excellente* idée.

------------------------------------------------------------------------------------------------------------------------
saisie.php

<? session_start(); // démarrage session ?>

<html>


Pour pouvoir profiter des services des validateurs automatiques, il
serait utile de choisir un DOCTYPE. D'ailleurs cela améliore la
compatibilité entre Internet Explorer et le reste du monde.

<head>
<SCRIPT language="javascript">


Remplacer « langage="javascript" » par « type="text/javascript" »
(je te dis ça de mémoire, mais c'est hors sujet ici -- à vérifier sur
fciwa ou sur fclj)

<meta http-equiv="Content-Language" content="fr">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html;


Il vaudrait mieux déclarer le charset dans les entêtes HTTP. Tiens, je
vais vérifier si c'est fait...

-----------------------------------------------------------------------
En-têtes HTTP (réponses) - http://membres.lycos.fr/psylyon/saisie.php

[...]
Content-Type: text/html
[...]

200 OK
-----------------------------------------------------------------------

Non, ce n'est pas bon. Voici un peu de lecture (en français) :
<http://french.joelonsoftware.com/Articles/Unicode.html>

charset=windows-1252">


Aaaaaargh ! :-(

[...]

<body background="sumtextb.jpg" bgcolor="#FFFFFF" text="#000066"
link="#3333CC" vlink="#666699" alink="#990099">


Tous ces paramètres (background, bgcolor, text, link, vlink et alink)
devraient être dans un fichier CSS plutôt que dans le code HTML.

<!--mstheme--><font face="Verdana, Arial,
Helvetica"><!--mstheme--></font>


Ici il y a deux commentaires inutiles, et le <font face> est du code
datant du début des années 1990. À proscrire, d'autant plus qu'il n'y a
pas de police par défaut (sans-serif en l'occurrence).

<h1 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">BON DE COMMANDE<!--mstheme--></font></h1>


Encore deux commentaires inutiles, plus un <font face>, avec en plus un
attribut color.

<!--mstheme--><font face="Verdana, Arial, Helvetica">


C'est reparti pour un tour... commentaire inutile plus <font face>

<p align="center">&nbsp;</p>
<p align="center">&nbsp;</p>


Alors là, c'est le pompon ! Tu as deux paragraphes vides quoique
centrés, qui sont du code non-inline, donc qui ferment la balise
<font>, laquelle n'a donc servi à rien, mais sans la balise fermante qui
était obligatoire...

Bon, je crois que je vais sauter la suite avant d'être de mauvaise
humeur, pour aller voir cette histoire d'envoi de courriel.

[...]

<FORM ACTION="validation.php" METHOD="post">

<!--mstheme--></font>


Ahem... ici, tu as une balise ouvrante <form> non fermée, suivie par une
balise fermante </font> non ouverte... :-((

Bon, c'est décidé, j'arrête ici la lecture de ce fichier, je crains de
tomber en plus sur une mise en page à base de <table>.


------------------------------------------------------------------------------------------------------------------------
traitement.php

<? session_start(); // démarrage session ?>

[...]

<? $Q1=$_POST["quantite1"] ; $_SESSION['Q1']=$Q1; // on récupère
les quantités définies à la page de saisie
$Q2=$_POST["quantite2"] ; $_SESSION['Q2']=$Q2;
$Q3=$_POST["quantite3"] ; $_SESSION['Q3']=$Q3;
$Q4=$_POST["quantite4"] ; $_SESSION['Q4']=$Q4;

$nom=$_POST['nom'] ; $_SESSION['nom']=$nom; // on récupère
les infos persos définies à la page de saisie
$prenom= $_POST['prenom'] ;$_SESSION['prenom']=$prenom;


Tu ne vérifies aucun des paramètres qui te viennent de l'extérieur, ce
qui est mal ©.

$email= $_POST['email'] ; $_SESSION['email']=$email;


Nous y voilà.

[...]

// création des entetes, destinaraire,sujet du message à
envoyer au webmestre
$mailheaders = "From: mon site web <> n";
$mailheaders .= "Reply-To: $emailnn";
[...]
mail($destinataire, $sujet, $msg, $mailheaders);


Je l'aurais parié. Ton script *est* utilisable pour spammer des millions
de gens par paquets de mille.

Il suffit pour cela que $email contienne :

"
Subject: Il est beau mon spam il est beaun
Bcc:
... n
... "


Bon, il y a du boulot. Mon premier conseil serait quand même de
commencer par du pur HTML avant de passer à PHP et JavaScript, et de
le faire valider en HTML 4.01 (Transitional, ou -- mieux -- Strict).
Ça se passe par exemple ici : <http://validator.w3.org/>.

Plus exactement :
<http://validator.w3.org/check?uri=http%3A%2F%2Fmembres.lycos.fr%2Fpsylyon%2Fsaisie.php>


Cordialement, et en te souhaitant bon courage,
--
Olivier Miakinen

Avatar
Vincent Lascaux
Il suffit pour cela que $email contienne :

"
Subject: Il est beau mon spam il est beaun
Bcc:
... n
... "


Quand est ce qu'ils vont fixer ce bug les gars de PHP ?
La doc dit "subject Sujet du mail à envoyer"

Je n'ai pas été lire en profondeur la RFC sur les emails, et je ne sais pas
s'il y a un moyen d'envoyer un email avec un sujet de plusieurs lignes. Mais
si ce n'est pas le cas, la moindre des choses serait que la fonction mail
déclare qu'elle n'a pas réussi à envoyer le mail (et donc qu'elle retourne
false) plutot que d'envoyer un mail avec un autre sujet à d'autres
destinataires.

Je suis sur que c'est 2 lignes de code dans la fonction mail (en php il
suffit de rajouter un if (strpos($subject, "n") === FALSE) return false;
avant de traiter l'email), et ca boucherai un énorme trou de sécu dans un
beau paquet de sites écrits en PHP

--
Vincent

Avatar
Vincent Lascaux
<? // on définit ici les prix unitaires de chaque article

$_SESSION['PU1']=2.65; $PU1=$_SESSION['PU1'];
$_SESSION['PU2']=3.63; $PU2=$_SESSION['PU2'];
$_SESSION['PU3']=5.74; $PU3=$_SESSION['PU3'];
$_SESSION['PU4']=1.27; $PU4=$_SESSION['PU4'];

// on définit le nom des articles
$_SESSION['article1']="article N°1" ;
$article1=$_SESSION['article1'];
$_SESSION['article2']="article N°2" ;
$article2=$_SESSION['article2'];
$_SESSION['article3']="article N°3" ;
$article3=$_SESSION['article3'];
$_SESSION['article4']="article N°4" ;
$article4=$_SESSION['article4'];

?>


Pourquoi stocker toute ces données dans la session ?
Tu ferais mieux de les mettre dans un fichier php que tu include. Un

articles.php
<?
$PU1 = 2.65;
$PU2 = 3.63;
...

$article1 = "article N°1";
...
?>

Ensuite, dans tous les scripts où tu as besoin d'acceder au prix des
articles, tu fais
require 'articles.php';

--
Vincent

Avatar
Olivier Miakinen
Il suffit pour cela que $email contienne :

"
Subject: Il est beau mon spam il est beaun
Bcc:
... n
... "


Quand est ce qu'ils vont fixer ce bug les gars de PHP ?
La doc dit "subject Sujet du mail à envoyer"


Euh... il s'agit ici du champ additional_headers et pas du champ
subject. Je ne vois pas bien quel « bug » pourrait être « fixé »
ici : toute restriction sur ce champ rendrait la fonction globalement
inutilisable.

Je n'ai pas été lire en profondeur la RFC sur les emails,


Moi si, même si j'ai pu passer à côté de certaines choses.

et je ne sais pas
s'il y a un moyen d'envoyer un email avec un sujet de plusieurs lignes.


C'est non seulement possible, mais même recommandé dans certains cas
pour ne pas dépasser la limite des 78 caractères par ligne (en utilisant
les « FWS (folding white space) ». Donc tu vois, même s'il s'était agi
du champ subject, il serait contraire à la norme d'interdire les retours
chariot dedans.

Mais
si ce n'est pas le cas, la moindre des choses serait que la fonction mail
déclare qu'elle n'a pas réussi à envoyer le mail (et donc qu'elle retourne
false) plutot que d'envoyer un mail avec un autre sujet à d'autres
destinataires.


Et comme c'est le cas il est urgent de ne rien faire.

Je suis sur que c'est 2 lignes de code dans la fonction mail (en php il
suffit de rajouter un if (strpos($subject, "n") === FALSE) return false;
avant de traiter l'email), et ca boucherai un énorme trou de sécu dans un
beau paquet de sites écrits en PHP


Pour terminer, je rajouterai qu'ajouter des contraintes supplémentaires
afin de tenter de se substituer au cerveau de l'utilisateur est toujours
une mauvaise idée en matière de sécurité : il vaut mieux au contraire
que l'utilisateur d'une telle fonction sache qu'il y a de gros risques,
et comprenne lesquels afin d'agir en conséquence. ÀMHA, il n'y a rien de
pire que de laisser croire à l'utilisateur qu'« il n'y a pas de danger
puisque la fonction mail contrôle les n d'elle-même ».


Avatar
Vincent Lascaux
"
Subject: Il est beau mon spam il est beaun
Bcc:
... n
... "


Quand est ce qu'ils vont fixer ce bug les gars de PHP ?
La doc dit "subject Sujet du mail à envoyer"


Euh... il s'agit ici du champ additional_headers et pas du champ
subject. Je ne vois pas bien quel « bug » pourrait être « fixé »
ici : toute restriction sur ce champ rendrait la fonction globalement
inutilisable.


Oups, j'ai mal lu ton message. Le bug auquel je pensais consiste à passer la
chaine que tu as indiquée dans le champ destinataire ou subject.

et je ne sais pas
s'il y a un moyen d'envoyer un email avec un sujet de plusieurs lignes.


C'est non seulement possible, mais même recommandé dans certains cas
pour ne pas dépasser la limite des 78 caractères par ligne (en utilisant
les « FWS (folding white space) ». Donc tu vois, même s'il s'était agi
du champ subject, il serait contraire à la norme d'interdire les retours
chariot dedans.


Euh... FWS (folding white space) c'est pas vraiment un retour chariot.
Vu que les champs dans le header sont séparés par des retours chariots, je
nous vois mal en mettre un non "encrypté" dans le sujet, comme ca... Je me
demandais si la norme prévoyais un encodage (du même type que tu peux avoir
dans les URLs par exemple) pour permettre d'avoir un retour chariot dans le
sujet.

D'ailleurs la doc de PHP dit
"subject Sujet du mail à envoyer.
Il ne doit comporter aucun caractère de nouvelle ligne sinon, le mail risque
de ne pas être envoyé correctement."

Pour terminer, je rajouterai qu'ajouter des contraintes supplémentaires
afin de tenter de se substituer au cerveau de l'utilisateur est toujours
une mauvaise idée en matière de sécurité : il vaut mieux au contraire
que l'utilisateur d'une telle fonction sache qu'il y a de gros risques,
et comprenne lesquels afin d'agir en conséquence. ÀMHA, il n'y a rien de
pire que de laisser croire à l'utilisateur qu'« il n'y a pas de danger
puisque la fonction mail contrôle les n d'elle-même ».


S'il n'y a vraiment pas de danger c'est tout bon. Je vois pas pourquoi je
devrais valider les données que je fournis à la fonction mail. Les fonctions
PHP valident leur données d'entrée un minimum, elle ne font pas n'importe
quoi (genre envoyer l'email avec un sujet différent à des personnes
différentes) si on leur passe pas un truc formaté comme elles attendent
(prends par exemple les fonctions de regexp, si tu donnes un truc qui n'est
pas une regexp valide, elle retournent une erreur, elles font pas n'importe
quoi).

--
Vincent



Avatar
Olivier Miakinen

Euh... il s'agit ici du champ additional_headers et pas du champ
subject. Je ne vois pas bien quel « bug » pourrait être « fixé »
ici : toute restriction sur ce champ rendrait la fonction globalement
inutilisable.


Oups, j'ai mal lu ton message. Le bug auquel je pensais consiste à passer la
chaine que tu as indiquée dans le champ destinataire ou subject.


Ok. Mais avec les FWS, il est parfaitement valide et même recommandé
d'avoir des CRLF dans n'importe quel champ.

Euh... FWS (folding white space) c'est pas vraiment un retour chariot.


Très exactement, c'est un CR+LF ajouté avant une espace. Dans
l'interface proposée par PHP c'est un "n" rajouté avant un " "
ou un "t" (le "r" est rajouté automatiquement).

Vu que les champs dans le header sont séparés par des retours chariots, je
nous vois mal en mettre un non "encrypté" dans le sujet, comme ca... Je me
demandais si la norme prévoyais un encodage (du même type que tu peux avoir
dans les URLs par exemple) pour permettre d'avoir un retour chariot dans le
sujet.


Attention, ne confondons pas la suite d'octets effectivement transmise
avec l'affichage obtenu. Un "n" appartenant à un FWS est parfaitement
transparent du point de vue de l'affichage (et même de la sémantique du
champ). Inversement, un saut de ligne à l'affichage pourrait être obtenu
sans qu'aucun "n" soit transmis, en l'encodant en QP ou en Base64.

D'ailleurs la doc de PHP dit
"subject Sujet du mail à envoyer.
Il ne doit comporter aucun caractère de nouvelle ligne sinon, le mail risque
de ne pas être envoyé correctement."


Il *risque* de ne pas être envoyé correctement. Et plus encore il
*risque* de ne pas donner le résultat escompté par celui qui n'a pas lu
le RFC 2822. Mais cela ne veut pas dire que c'est interdit, ni que cela
donnera forcément un résultat incohérent : un "n" inséré avant une
espace ne change strictement rien à la sémantique d'un champ d'entête.

Bien évidemment, si quelqu'un écrit "Subject: essainavec LF" cela ne
marchera pas.

S'il n'y a vraiment pas de danger c'est tout bon. Je vois pas pourquoi je
devrais valider les données que je fournis à la fonction mail. Les fonctions
PHP valident leur données d'entrée un minimum, elle ne font pas n'importe
quoi (genre envoyer l'email avec un sujet différent à des personnes
différentes) si on leur passe pas un truc formaté comme elles attendent
(prends par exemple les fonctions de regexp, si tu donnes un truc qui n'est
pas une regexp valide, elle retournent une erreur, elles font pas n'importe
quoi).


Bon. En fait, pour le champ Subject, il y aurait effectivement un test
possible : interdire tout un n *sauf s'il est suivi d'une espace*. Mais
c'est un peu compliqué alors qu'il suffit que l'appelant ne fasse pas
n'importe quoi, et sachant que *de toute façon* l'appelant doit aussi
vérifier les autres champs d'entête.

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)


Avatar
Laurent
Le 29 Jun 2006 23:07:50 GMT, Olivier Miakinen <om+ a

Bienvenue chez les fous. ©


merci !


Ouf, c'est en effet assez ambitieux pour un débutant complet.


en fait, je suis prof en collège, cet année mes élèves m'ont demandé
de faire un club php, et on a essayé d'apprendre ensemble (on se sent
moins seul dans la détresse) ... je leur ai fait faire des petits
programmes simples, du calcul de PGCD au poids idéal etc... bien sur
on est parti de zéro sur tout . moi j'ai déjà programmé un peu en vba
et turbo pascal...


Aïe aïe aïe... je n'ai pas encore lu ton code, mais je regarderai tout
particulièrement cette partie. Je dirais à priori que tu as plus de 99 %
de chances d'avoir fait un relais à spam.


oui je m'en doutais un peu , c'est pourquoi j'ai désactivé... je
suppose qu'un simple test du type : "si il y a autre chose qu'une
simple adresse mail alors rejeter l'envoi", ne suffit pas.
Peut on via un formulaire taper du code php ou autre qui sera
interpreté par le serveur? si oui comment empecher ça? (ne pas
détailler la réponse ... juste quelques mots ou liens clés me
suffiront)


Frontpage n'est peut-être pas le meilleur outil pour faire des pages
html. Ce n'est pas le pire non plus parce qu'il y a Windows Word qui
le bat assurément...


oui j'utilise habituellement notepad ++ mais là j'avais la flemme. je
regrette un peu, mais promis, je vais faire un effort? sinon NVU ?
dreamweaver?
que me conseilles tu?


Il peut arriver plein de choses si tu ne vérifies pas attentivement ce
que tu fais des paramètres qui viennent de l'extérieur, par exemple une
corruption de ta base de données si tu en utilises, ou l'effacement de
tous les fichiers de ton serveur, ou encore l'utilisation de ton script
pour aller spammer la terre entière en toute impunité.


comment peut on accèder aux fichiers serveurs sur mon code actuel? ça
me parait étrange? en mettant du code dans les entrées de formulaires?
ça m'intereserait de savoir.

Tu dois d'abord faire toutes les vérifications en PHP puisque
l'utilisateur peut fort bien désactiver toute fonction JavaScript,
ou bien les adapter selon son goût.


oui j'avais oublié ce probleme ! pas grave, je peux pas toucher à tout
en meme temps de toutes façons. c'était juste pour voir.

http://faqfclphp.free.fr/#rub5.3
merci pour ce super lien !



J'ai rarement vu des publicités aussi intrusives que celles de Lycos.
Bon, j'irai peut-être voir, mais en désactivant JavaScript.


oui je sais, c pourri. je n'utilise plus... j'ai migré mes sites mais
pour faire des essais, c'est pratique d'utiliser de vieux comptes





Pour pouvoir profiter des services des validateurs automatiques, il
serait utile de choisir un DOCTYPE. D'ailleurs cela améliore la
compatibilité entre Internet Explorer et le reste du monde.


bon je vais voir , je suppose que tu veux parler de tout ce qui est
CSS et cie... aie.. bon, encore du boulot !

vous connaissez des liens vers des cours en ligne (à part le site du
zéro) ?



Remplacer « langage="javascript" » par « type="text/javascript" »
(je te dis ça de mémoire, mais c'est hors sujet ici -- à vérifier sur
fciwa ou sur fclj)


je laisse tomber ça pour l'instant.


Il vaudrait mieux déclarer le charset dans les entêtes HTTP. Tiens, je
vais vérifier si c'est fait...



j'y comprends rien à ça.. d'habitude, je mets rien c'est mieux? la c
frontpage qui a mis !

-----------------------------------------------------------------------
En-têtes HTTP (réponses) - http://membres.lycos.fr/psylyon/saisie.php

[...]
Content-Type: text/html


tu vois ça ou?


Non, ce n'est pas bon. Voici un peu de lecture (en français) :
<http://french.joelonsoftware.com/Articles/Unicode.html>

charset=windows-1252">




OK super le lien, je vais lire ça ce soir à tete reposée !



Ici il y a deux commentaires inutiles, et le <font face> est du code
datant du début des années 1990. À proscrire, d'autant plus qu'il n'y a
pas de police par défaut (sans-serif en l'occurrence).

<h1 align="center"><!--mstheme--><font face="Verdana, Arial,
Helvetica" color="#003366">BON DE COMMANDE<!--mstheme--></font></h1>


Encore deux commentaires inutiles, plus un <font face>, avec en plus un
attribut color.

Bon, je crois que je vais sauter la suite avant d'être de mauvaise
humeur, pour aller voir cette histoire d'envoi de courriel.


oui j'imagine que le code automatique généré par FP est nul. pas la
peine de perdre son temps avec le html , ce qui m'interesse surtout en
fait, c'est la critique du code PHP car pour le HTML, je vais
reprendre ensuite.


Bon, c'est décidé, j'arrête ici la lecture de ce fichier, je crains de
tomber en plus sur une mise en page à base de <table>.


c'est grave docteur? oui il ne fallait pas s'embeter avec le HTML,
j'ai surtout envie de progresser dans la programmation du code PHP
pour l'instant.

------------------------------------------------------------------------------------------------------------------------
traitement.php

<? session_start(); // démarrage session ?>

[...]

<? $Q1=$_POST["quantite1"] ; $_SESSION['Q1']=$Q1; // on récupère
les quantités définies à la page de saisie
$Q2=$_POST["quantite2"] ; $_SESSION['Q2']=$Q2;
$Q3=$_POST["quantite3"] ; $_SESSION['Q3']=$Q3;
$Q4=$_POST["quantite4"] ; $_SESSION['Q4']=$Q4;

$nom=$_POST['nom'] ; $_SESSION['nom']=$nom; // on récupère
les infos persos définies à la page de saisie
$prenom= $_POST['prenom'] ;$_SESSION['prenom']=$prenom;


Tu ne vérifies aucun des paramètres qui te viennent de l'extérieur, ce
qui est mal ©.

$email= $_POST['email'] ; $_SESSION['email']=$email;


Nous y voilà.


est ce qu'il n'y a pas un moyen plus simple de faire passer toutes les
variables d'une page à l'autre? une super instruction en somme?




Je l'aurais parié. Ton script *est* utilisable pour spammer des millions

de gens par paquets de mille.


oui j'imagine... alors je vais bosser la dessus promis.. et je reviens
dans quelques jours...



quand même de
commencer par du pur HTML avant de passer à PHP et JavaScript, et de
le faire valider en HTML 4.01 (Transitional, ou -- mieux -- Strict).
Ça se passe par exemple ici : <http://validator.w3.org/>.



ok super merci beaucoup pour le temps passé !!! c'est très précieux
pour moi tout ça...


Plus exactement :
<http://validator.w3.org/check?uri=http%3A%2F%2Fmembres.lycos.fr%2Fpsylyon%2Fsaisie.php>



Cordialement, et en te souhaitant bon courage,


merci super sympa !
--
me répondre via l'adresse email protégée:
http://cerbermail.com/?4s2gdXzrwp


Avatar
Vincent Lascaux
D'ailleurs la doc de PHP dit
"subject Sujet du mail à envoyer.
Il ne doit comporter aucun caractère de nouvelle ligne sinon, le mail
risque
de ne pas être envoyé correctement."


Il *risque* de ne pas être envoyé correctement. Et plus encore il
*risque* de ne pas donner le résultat escompté par celui qui n'a pas lu
le RFC 2822. Mais cela ne veut pas dire que c'est interdit, ni que cela
donnera forcément un résultat incohérent : un "n" inséré avant une
espace ne change strictement rien à la sémantique d'un champ d'entête.


En tant qu'utilisateur de la fonction mail, je suis pas censé connaitre la
RFC. Si les chaines de plus de 78 caracteres doivent être coupées par un "n
", c'est à la fonction mail de le faire, pas à moi.
La doc dit que le second parametre est le titre, et que si on ne réussit pas
à envoyer l'email ca retourne false. Je m'attends à ce que si je passe un
titre avec un n dedans, il sera envoyé de façon à ce que ca apparaisse avec
un retour chariot chez le client. Si c'est pas possible (et c'est le cas),
je m'attends à ce que mail retourne false, pas qu'il envoit un email avec un
titre différent à d'autre destinataires.

--
Vincent


Avatar
Eric Demeester
dans (in) fr.comp.lang.php, Vincent Lascaux
ecrivait (wrote) :

Bonsoir Vincent,

En tant qu'utilisateur de la fonction mail, je suis pas censé connaitre la
RFC.


Ben si, à mon humble avis, parce que la fonction mail() de PHP est
notoirement connue pour être une calamité et que si on est contraint de
l'utiliser, autant comprendre toutes ses subtilités et prendre toutes
les précautions nécessaires afin de l'utiliser le moins mal possible, en
filtrant soigneusement ce qui est rentré dans la champs "To: " d'un
formulaire en ligne par exemple.

En d'autres termes, la lecture des RFC, leur compréhension puis
l'application des conseils prodigués ne peuvent qu'améliorer les choses,
à savoir dans le cas qui nous occupe la satisfaction mutuelle de ceux
qui l'utilisent et la tienne...

Si les chaines de plus de 78 caracteres doivent être coupées par un "n
", c'est à la fonction mail de le faire, pas à moi.


Cette fonction est mal écrite et source de problèmes comme d'abus. C'est
un fait, que vous dire d'autre ? Je pourrais te proposer un script
appelant directement le serveur de courrier plutôt que d'utiliser la
fonction mail() de PHP, mais s'il fonctionne chez moi, rien ne permet de
penser qu'il fonctionnera ailleurs, tout dépend des ressources mises à
ta disposition par ton hébergeur, mais on s'égare...

Bon courage.

(et juste mon avis comme il se doit)

--
Eric

Avatar
Olivier Miakinen

en fait, je suis prof en collège, cet année mes élèves m'ont demandé
de faire un club php, et on a essayé d'apprendre ensemble (on se sent
moins seul dans la détresse) ... je leur ai fait faire des petits
programmes simples, du calcul de PGCD au poids idéal etc... bien sur
on est parti de zéro sur tout . moi j'ai déjà programmé un peu en vba
et turbo pascal...


Bon, tant que les pages sont mises sur un ordi interne à l'école et
inaccessible de l'extérieur, c'est déjà un peu moins risqué. Cela dit,
quand on débute, il est plus gratifiant de pouvoir montrer le résultat
de ses efforts au monde entier -- et encore plus de pouvoir se vanter
d'avoir fait un site valide en HTML 4.01 Strict. ;-)

Aïe aïe aïe... je n'ai pas encore lu ton code, mais je regarderai tout
particulièrement cette partie. Je dirais à priori que tu as plus de 99 %
de chances d'avoir fait un relais à spam.


oui je m'en doutais un peu , c'est pourquoi j'ai désactivé... je
suppose qu'un simple test du type : "si il y a autre chose qu'une
simple adresse mail alors rejeter l'envoi", ne suffit pas.


Ici, en l'occurrence, vérifier que l'adresse passe l'un des tests donnés
sur <http://faqfclphp.free.fr/#rub5.3> devrait permettre d'éviter cet
écueil -- du moins tant que tu laisses les autres champs d'entête en dur
(en particulier $destinataire et $sujet). Cela dit, ton message présente
un autre problème, et c'est l'utilisation d'un caractère non-ASCII (le
symbole € encodé en Windows cp1252) sans déclaration de charset dans les
entêtes du message.

Peut on via un formulaire taper du code php ou autre qui sera
interpreté par le serveur? si oui comment empecher ça? (ne pas
détailler la réponse ... juste quelques mots ou liens clés me
suffiront)


En fait, tout dépend de ce que fait ton code des paramètres provenant
de l'extérieur.

Un exemple vu sur <http://thedailywtf.com/> :
--------------------------------------------------------
function terminate() {
exec("rm -r /var/public_www/$_SESSION['Tempfile']");
}
--------------------------------------------------------
Ici, il suffit que le visiteur rafraîchisse la page après expiration de
la session pour supprimer la totalité du site web au lieu de n'effacer
que les fichiers temporaires qui étaient liés à cette session.

Frontpage n'est peut-être pas le meilleur outil [...]


oui j'utilise habituellement notepad ++ mais là j'avais la flemme. je
regrette un peu, mais promis, je vais faire un effort? sinon NVU ?
dreamweaver?
que me conseilles tu?


Moi j'utilise vim, qui doit être à peu près du même niveau que
Notepad++. Cela dit, j'ai entendu dire beaucoup de bien (et un peu
de mal quand même) de NVU. Quant à Dreamweaver, j'en ai entendu dire
énormément de mal il y a quelques années, mais il semblerait qu'à
partir d'une certaine version il sache faire des sites valides.

Après, tout cela n'est qu'une question de goûts.

Il peut arriver plein de choses si tu ne vérifies pas attentivement ce
que tu fais des paramètres qui viennent de l'extérieur, par exemple une
corruption de ta base de données si tu en utilises, ou l'effacement de
tous les fichiers de ton serveur, ou encore l'utilisation de ton script
pour aller spammer la terre entière en toute impunité.


comment peut on accèder aux fichiers serveurs sur mon code actuel? ça
me parait étrange? en mettant du code dans les entrées de formulaires?
ça m'intereserait de savoir.


Sur ton code actuel, je ne sais pas si c'est possible (j'avoue ne
l'avoir que parcouru vite fait, sauf le début et la fin). À part ça,
j'ai déjà cité un cas possible de destruction complète d'un site, qui
plus est sans intention malveillante de la part des visiteurs.

Il existe d'autres cas facilitant le piratage. Par exemple si dans un
formulaire tu mets un attribut hidden « include=machin.php » ou
« include=truc.php » selon le cas, et que dans ton code PHP il y a
« <?php include($_REQUEST['include']); ?> », alors un visiteur
malveillant pourrait faire une requête avec "/etc/passwd" comme
valeur de l'attribut include.

Pour pouvoir profiter des services des validateurs automatiques, il
serait utile de choisir un DOCTYPE. D'ailleurs cela améliore la
compatibilité entre Internet Explorer et le reste du monde.


bon je vais voir , je suppose que tu veux parler de tout ce qui est
CSS et cie... aie.. bon, encore du boulot !


Oui, entre autres choses. En effet c'est du boulot.

vous connaissez des liens vers des cours en ligne (à part le site du
zéro) ?


Peut-être sur <http://www.openweb.eu.org/> ?

Il vaudrait mieux déclarer le charset dans les entêtes HTTP. Tiens, je
vais vérifier si c'est fait...


j'y comprends rien à ça..


La page de Joël Spolsky déjà citée devrait t'aider à y voir plus clair.

d'habitude, je mets rien c'est mieux? la c
frontpage qui a mis !


Tu peux ajouter ça au tout début, juste avant ou juste après le
session_start() :

header('Content-Type: text/html; charset="UTF-8"');

... quoique pour ne pas tout mélanger tu peux commencer par mettre
"ISO-8859-1" à la place de "UTF-8".

-----------------------------------------------------------------------
En-têtes HTTP (réponses) - http://membres.lycos.fr/psylyon/saisie.php

[...]
Content-Type: text/html


tu vois ça ou?


Avec l'extension « web developer » sur Mozilla (c'est la seule extension
que j'aie installée), en cliquant sur :
Informations > En-têtes HTTP (réponses)

Il y a d'autres moyens, par exemple l'utilitaire wget, ou tout
simplement avec telnet.

[...] je crains de
tomber en plus sur une mise en page à base de <table>.


c'est grave docteur?


Quand tu auras un peu de temps tu pourras lire ceci :
<http://www.openweb.eu.org/articles/problemes_tableaux/>
... mais ce n'est pas le plus urgent. Corriger les erreurs
de validation et les trous de sécurité PHP est plus important
qu'apprendre suffisamment de CSS pour faire une belle mise en
page sans tableaux.

[ utilisation de $_SESSION ]


est ce qu'il n'y a pas un moyen plus simple de faire passer toutes les
variables d'une page à l'autre? une super instruction en somme?


Une façon de faire consisterait à passer par un nouveau formulaire
dans la page récapitulative, avec tous les paramètres passés en
champs hidden. Mais cela t'oblige à valider une nouvelle fois tous
les paramètres dans la troisième page puisqu'un visiteur malveillant
peut très bien les changer en cours de route.

Une autre façon consiste à générer un identifiant unique, et à stocker
les variables dans une base de données, avec cet identifiant comme clé.
Tu n'as plus alors qu'à passer ce seul identifiant dans $_SESSION. Mais
bon, j'arrive là en dehors de mon niveau de compétence car je n'ai
encore jamais utilisé de base de données.


Cordialement,
--
Olivier Miakinen


1 2 3