1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P20 pptx

5 425 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 221,95 KB

Nội dung

2.2 Traitement des données transmises par HTTP 73 mysql> INSERT INTO Mail (destinataire, sujet, message, date_envoi) -> VALUES (’rigaux@lri.fr’, ’Essai’, ’Test du mail’, NOW()); Query OK, 1 row affected (0,00 sec) La fonction LAST_INSERT_ID() permet de savoir quelle est la dernière valeur générée pour un champ AUTO_INCREMENT. mysql> SELECT LAST_INSERT_ID() ; + + | last_insert_id() | + + |36| + + 1 row in set (0.06 sec) mysql> Enfin, on peut vérifier qu’il est impossible d’insérer deux fois un e-mail avec le même identifiant. mysql> INSERT INTO Mail (id_mail, destinataire, sujet, -> message, date_envoi) -> VALUES (36, ’rigaux@dauphine.fr’, ’Essai’, ’Test du mail’, NOW()); ERROR 1062 (23000): Duplicate entry ’36’ for key 1 Nous reviendrons sur ces questions – essentielles – d’identification dans le cha- pitre 4. La fonction ci-dessous prend un tableau en paramètre, traite ses entrées en échappant les apostrophes, et exécute enfin la requête. Exemple 2.14 exemples/StockeMail.php : Commande d’insertion dans MySQL <?php require_once ("UtilBD.php"); // Fonction stockant un e−mail dans la base . Le tableau en // paramètre doit contenir les entrées destinataire , sujet // et message. NB: il faudrait vérifier les valeurs . function StockeMail ($mail) { // Connexion au serveur $connexion = Connexion (NOM, PASSE, BASE, SERVEUR) ; // On "échappe" les caractères gênants. $destinataire = mysql_real_escape_string($mail[ ’ destinataire ’]) ; $sujet = mysql_real_escape_string($mail[ ’sujet ’ ]) ; $message = mysql_real_escape_string($mail[ ’message ’]) ; // Création et exécution de la requête 74 Chapitre 2. Techniques de base $requete = "INSERT INTO Mail(destinataire , sujet , message , date_envoi) " . "VALUES ( ’ $ d e s t i n a t a i r e ’ , ’ $ s u j e t ’ , ’ $ me s sa g e ’ , NOW( ) ) " ; ExecRequete ($requete , $connexion); } ?> Suite à notre décision d’éliminer tout échappement automatique en entrée d’un script PHP, il faudra penser systématiquement à traiter avec la fonction mysql_real_escape_string() les chaînes à insérer dans MySQL 2 . 2.2.4 Traitement de la réponse Avant afficher, dans un document HTML, un texte saisi dans un formulaire, il faut se poser les questions suivantes : • Quelle sera la mise en forme obtenue ? Rend-elle correctement la saisie de l’utilisateur ? • Le texte peut-il contenir lui-même des balises HTML qui vont gêner l’affi- chage ? Voici un exemple de texte que l’utilisateur pourrait saisir dans le formulaire, potentiellement source de problème : Pour cr´eer un formulaire, on utilise la balise <form> et une suite de balises <input>. Voici un exemple ci-dessous: <form action=’monscript’> <input type=text name==’n1’ size=’10’/> <input type=text name==’n2’ size=’10’/> <input type=’submit’/> </form> Bonne r´eception! PR Quand on transmet le texte saisi dans une fenêtre de formulaire au script et que ce dernier le renvoie au navigateur pour l’afficher, on obtient le résultat de la figure 2.3. Les balises apparaissent littéralement et ne sont pas interprétées par le navigateur. Pourquoi ? Parce que nous les avons traitées avec htmlSpecialChars() et que le texte <input> a été remplacé par &lt;input&gt;. Faites l’essai, et retirez le filtrage par htmlspecialChars() pour constater les dégâts à l’affichage. 2. Il est d’usage d’appeler addSlashes() qui suffira dans la très grande majorité des cas, mais mysql_real_escape_string() est un peu plus complète et adaptée à MySQL, pour la prise en compte des jeux de caractères par exemple. 2.2 Traitement des données transmises par HTTP 75 Par ailleurs, pour conserver les sauts de ligne en HTML, il faut insérer explicite- ment des balises <br/>. PHP fournit une fonction, nl2br(), qui permet de convertir les caractères de sauts de ligne en balises <br/>, préservant ainsi l’affichage. Figure 2.3 — Affichage du texte d’un e-mail comprenant des balises La chaîne de caractères obtenue après ces traitements prophylactiques est donnée ci-dessous, ce qui permet d’afficher le résultat donné figure 2.3. <h1>Envoi de mail</h1> <b>On a envoy´e le message suivant: </b> <p>Pour cr´eer un formulaire, on utilise<br /> la balise &lt;form&gt; et une suite de balises<br /> &lt;input&gt;. Voici un exemple ci-dessous:<br /> <br /> &lt;form action=’monscript’&gt;<br /> &lt;input type=text name==’n1’ size=’10’&gt;<br /> &lt;input type=text name==’n2’ size=’10’&gt;<br /> &lt;input type=’submit’&gt;<br /> &lt;/form&gt;<br /> Bonne r´eception!<br /> <br /> PR La présence de lettres accentuées dans un document HTML ne pose pas de problème à un navigateur employant le jeu de caractères standard occidental ou l’UTF-8. Rappelons que ce réglage est spécifié au début du document avec l’option suivante pour Latin1 : <?xml version="1.0" encoding="iso-8859-1"?> 76 Chapitre 2. Techniques de base Une autre possibilité est de remplacer toutes les lettres accentuées (et de manière générale tous les caractères spéciaux) par un appel à l’entité correspondante (par exemple « é » devient « &eacute; »). On obtient ce remplacement avec la fonction htmlEntities(). 2.2.5 Comment obtenir du texte « pur » : envoi de l’e-mail Finalement, il reste à envoyer l’e-mail, grâce à la fonction mail() de PHP 3 .Les questions à se poser sont ici réciproques de celles étudiées ci-dessus pour le pas- sage d’une représentation en texte brut à une représentation HTML. Si le texte à envoyer contient des mises en forme HTML, on peut les supprimer avec la fonction strip_tags(), comme le montre la fonction ci-dessous. Exemple 2.15 exemples/EnvoiMail.php : Fonction d’envoi d’un e-mail <?php // Fonction envoyant un e−mail. On suppose // que les contrôles ont été effectués avant l ’ appel à la // fonction function EnvoiMail ($mail) { // Extraction des paramètres $destinataire = $mail[ ’destinataire ’]; $sujet = $mail[ ’sujet ’ ]; // On retire toutes les balises HTML du message $message = strip_tags($mail[ ’message ’ ]) ; // On va indiquer l ’expéditeur , et placer rigaux@dauphine. fr en // copie $entete = "From : mysqlphp@dunod . fr\r\n" ; $entete .= "Cc: rigaux@dauphine . fr\r\n" ; // Appel à la fonction PHP standard mail ($destinataire , $sujet , $message , $entete); } ?> L’étude de fonctionnalités plus avancées d’envoi d’e-mails (avec fichiers en atta- chement par exemple) dépasse le cadre de ce livre. Comme d’habitude je vous renvoie à php.net, ou à des fonctionnalités prêtes à l’emploi comme phpMailer (voir le site developpez.com). 3. Cette fonction nécessite l’accès à un serveur SMTP, et peut être désactivée chez votre fournisseur d’accès pour éviter l’envoi de spams (ou pourriels). 2.2 Traitement des données transmises par HTTP 77 2.2.6 En résumé: traitement des requêtes et des réponses Le cas d’école qui précède montre les principes règles à appliquer aux chaînes de caractères transmises par HTTP, et aux réponses transmises au client. Le tableau 2.1 rappelle pour sa part la liste des fonctions essentielles au traitement des données HTTP. 1. s’assurer, à l’entrée du script, que les chaînes suivent toujours la même règle d’échappement ; étant donné que la configuration peut varier, le seul moyen sûr est d’effectuer un pré-traitement à l’entrée dans le script (fonction NormalisationHTTP()); 2. effectuer tous les contrôles nécessaires sur la présence et les valeurs des données transmises ; 3. filter les données en entrées, en supprimant notamment les balises avec strip_tags() ou en les neutralisant avec htmlSpecialChars() ; 4. utiliser un échappement (avec « \ ») avant d’insérer dans la base MySQL ; 5. appliquer un échappement aux caractères réservés HTML (« < », « > », « & »), en les transformant en appels d’entités avant de transmettre à un navigateur ; 6. supprimer les balises HTML avant un affichage en mode texte (ou envoi d’un e-mail, ou toute autre situation comparable). Tableau 2.1 — Fonctions utilisées dans cette section Fonction Description get_magic_quotes_gpc Renvoie « vrai » si les guillemets et apostrophes sont automatique- ment « échappées » dans les chaînes transmises par HTTP, faux sinon. isSet(nom variable ) Renvoie vrai si la variable est définie, faux sinon. empty(nom variable ) Renvoie vrai si la variable n’est pas la chaîne vide, faux sinon. htmlEntities(cha^ıne ) Renvoie une chaîne où les caractères spéciaux présents dans cha^ıne sont remplacés par des entités. htmlSpecialChars(cha^ıne ) Renvoie une chaîne où les caractères « < », « > », « & », « ’ » et «"»présentsdans cha^ıne sont remplacés par des entités. strip_tags(cha^ıne,[balises ]) Renvoie une chaîne où les balises HTML présentes dans cha^ıne sont supprimées (à l’exception de celles données dans le second argument, optionnel). addSlashes(cha^ıne ) Renvoie une chaîne où les guillemets et apostrophes sont préfixées par « \ », notamment en vue de l’insertion dans une base de données. mysql_real_escape_string(cha^ıne ) Idem que la précédente, mais adaptée à MySQL pour le traitement de données binaires ou de lettres accentuées. stripSlashes(cha^ıne ) Fonction inverse de la précédente: renvoie une chaîne où les barres « \ » sont supprimées devant les guillemets et apostrophes. nb2br(cha^ıne ) Renvoie une chaîne où les caractères ASCII de fin de ligne (\n) sont remplacés par la balise <br/>. urlEncode(cha^ıne ) Renvoie une chaîne codée pour pouvoir être insérée dans une URL. . guillemets et apostrophes sont préfixées par « », notamment en vue de l’insertion dans une base de données. mysql_ real_escape_string(cha^ıne ) Idem que la précédente, mais adaptée à MySQL pour. traitement de données binaires ou de lettres accentuées. stripSlashes(cha^ıne ) Fonction inverse de la précédente: renvoie une chaîne où les barres « » sont supprimées devant les guillemets et apostrophes. nb2br(cha^ıne. "échappe" les caractères gênants. $destinataire = mysql_ real_escape_string($mail[ ’ destinataire ’]) ; $sujet = mysql_ real_escape_string($mail[ ’sujet ’ ]) ; $message = mysql_ real_escape_string($mail[

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN