APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Cours en Réponse à questions, n° 5 Valérie Bellynck, Benjamin Brichet-Billet, Mazen Mahrous Grenoble INP – Pagora 10 novembre 2014 Questions reçues Groupe : ? Autres groupes ? • ? Profs Qu’est-ce que la programmation orienté objets ? Quelle est la différence entre :: et -> ? Quels risques de piratage peut-on introduire avec des formulaires ? Comment y pallier ? Qu’est-ce qu’une expression régulière ? Comment récupérer la liste des colonnes d’une table mySQL ? Les objets dans PHP (4 et 5) Objet : exemple du point (x,y) • 2 variables séparées (« scalaires ») : float x, float y; ⚠ La structure n’est pas la valeur • Des structures de données : struct point { array(x,y) float x; float y; string struct { float x, float y } } pas en PHP struct { float x, float y, string nom } var p = (point) (2,3,’A’); nom; + des fonctions comme - définir un point ➙ Le constructeur réserve la mémoire et initialise - déplacer un point - supprimer un point ➙ Le destructeur libère la mémoire Une structure pour des valeurs ET des « méthodes » + héritage ➙ Un véhicule est un engin à roues permettant de se déplacer ➙ Une voiture est un véhicule à 4 roues … Manuel PHP : syntaxe de base Définition de la classe pseudo variable $this est une référence à l’objet appelant Instanciation d’un objet de la classe Exploitation d’une méthode de l’objet ↪ voir http://php.net/manual/fr/language.oop5.basic.php Manuel PHP : syntaxe de base Exemple : classe Personne et instances de la classe Personne Définition de la classe pseudo variable $this est une référence à l’objet appelant Instanciation d’un objet de la classe Exploitation d’une méthode de l’objet ↪ voir http://php.net/manual/fr/language.oop5.basic.php Manuel PHP : syntaxe de base ↪ voir http://php.net/manual/fr/language.oop5.basic.php Exemple javascript Utiliser directement un objet Pour définir un type d’objet, on doit créer une fonction pour le type d’objet ↪ voir https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Utiliser_les_objets Autres qualités de la programmation objet • Ne pas avoir besoin de passer tous les arguments en paramètre des fonctions, puisque certains sont des propriétés de l’objet contexte ↪ voir http://tiprof.fr/PHP-mySQL/ressources/php/POO-avec-PHP5.html Et http://www.phpdebutant.org/article42.php mysqli : procédural ET orienté objet ↪ voir http://php.net/manual/fr/mysqli.quickstart.dual-interface.php Portée d’une variable ↪ voir Exemple PHP5 ↪ voir Exemple en PHP4 ↪ voir http://tiprof.fr/PHP-mySQL/ressources/php/POO-avec-PHP5.html Sécurité Injection MySQL : le risque $user='moi';$password="' OR ''='"; Le code suivant : $query = "SELECT * FROM users WHERE user='$user' AND password='$password'"; mysql_query($query); va envoyer au serveur requête : AND password='' OR ''='' SELECT * FROM users MySQL WHERElauser='moi' il faut « échapper » les*quotes $query = sprintf("SELECT FROM: users WHERE user='%s' AND password='%s'", mysql_real_escape_string($user), mysql_real_escape_string($password) ); ↪ voir http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/ Etape 5 et http://tiprof.fr/PHP-mySQL/Travaux%20Dirig%C3%A9s/TD4-Deploie/ Injection MySQL : protection Il faut « échapper » les quotes : Mais la configuration du serveur lui dit peut-être déjà de le faire systématiquement Alors il ne faut pas toujours le faire faire en plus par les scripts PHP encapsuler dans une fonction ↪ voir http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html et http://tiprof.fr/PHP-mySQL/Travaux%20Dirig%C3%A9s/TD4-Deploie/ Valeurs affichées en HTML => insertion de pub / vol de session Lorsque les pages affichent des contenus introduits pas les visiteurs, comme des commentaires, affichés lorsque la page est visitée par les suivants Le principal risque est que le code à afficher contienne du javascript, qui sera alors exécuté «sur le client », et pourra afficher un encart issu d’un autre site ou modifier les valeurs identifiant la session Quelles balises permettent d’exécuter du javascript ? <script language="javascript" … <a href="javascript:alert('coucou')"> <img onload=“alert('coucou')” /> et tous les événements réactifs aux images <iframe oncload=“alert('coucou')"> ... aux encarts … refuser les contenus qui contiennent des balises « à risque » directement sur le client en Javascript ou sur le serveur en PHP ↪ voir http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/ et http://tiprof.fr/PHP-mySQL/Travaux%20Dirig%C3%A9s/TD4-Deploie/ Valeurs affichées en HTML : protection expressions régulières Comment refuser les contenus qui contiennent des balises « à risque » ? But : identifier toutes les chaînes de caractères qui contiennent un « motif » Par exemple ===> repérer <a … > … </a> dans la chaîne de caractères : le texte <a href="javascript:alert('coucou')">ce lien</a> n’est pas dangereux Défauts : • les calculs sont couteux s’il est possible de « faire plus simple », le faire Par exemple, en PHP utiliser trim() pour enlever les blancs en début et fin de chaîne • il y a des écarts entre les implémentations des fonctions pour traiter les RegEx dans les différents langages et des erreurs dans les implémentations courantes ( = décallages entre les résultats et la théorie) ↪ voir http://tiprof.fr/Essais-php-js/reg-exp/ http://www.regular-expressions.info/javascriptexample.html et http://www.expreg.com/ et aussi http://lumadis.be/regex/tuto_pcre.php (utilisateurs avancés) Expressions régulières : exemple de la balise <img> But : repérer <img … /> dans la chaîne de caractères : le texte <img src="avartar.gif" onload="alert('coucou')" /> n’est pas dangereux ↪ voir http://tiprof.fr/Essais-php-js/reg-exp/ Expressions régulières : exemple de la balise <a> But : repérer <a … > … </a> dans la chaîne de caractères : le texte <a href="javascript:alert('coucou')">ce lien</a> n’est pas dangereux ↪ voir http://tiprof.fr/Essais-php-js/reg-exp/ Expressions régulières : par des fonctions PHP Comment faire en PHP ? 2 bibliothèques : • PCRE exécutent des codes d’un autre langages : PERL plusieurs fonctions dont le nom commence par preg_...() • POSIX plus lent que PRCE plusieurs fonctions dont le nom commence par ereg_...() ou split...() preg_match( $regexp, $subject, $matches ) analyse la chaîne jusqu’à avoir trouvé le motif preg_match_all( $regexp, $subject, $matches ) après avoir trouvé le premier résultat, la recherche continue jusqu’à la fin de la chaîne preg_replace($regexp, $remplacement, $subject) après avoir trouver la ou les chaînes, remplace des parties par un correspondant ↪ voir http://www.expreg.com/presentation.php $regexp est la chaîne qui définit le motif à retrouver et http://openclassrooms.com/courses/concevez-votre-site-web-avec-php-et-mysql/les-expressions-regulieres-partie-1-2 Expressions régulières : un exemple en PHP But : repérer <a … > … </a> dans la chaîne de caractères : le texte <a href="javascript:alert('coucou')">ce lien</a> n’est pas dangereux code PHP : ↪ voir http://tiprof.fr/Essais-php-js/reg-exp/ preg_match() Expressions régulières : exemple avec preg_match() analyse la chaîne jusqu’à avoir trouvé le motif Expressions régulières : exemple avec preg_match_all() preg_match_all() après avoir trouvé le premier résultat, la recherche continue jusqu’à la fin de la chaîne Expressions régulières : exemple avec preg_match_replace() preg_match_replace() après avoir trouver la ou les chaînes, remplace des parties par un correspondant Expressions régulières : délimiteurs En plus des quotes ("", ’’) qui sont nécessaires pour le langage de script, la chaîne qui définit le motif doit être délimitée par un caractère identique, comme / ou #, et peut être suivie par une option Par exemple : #<a(.*)>(.*)</a># /(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/ Des options sont spécifiables : i PCRE_CASELESS u PCRE_UTF8 insensible à la casse Les chaînes sont traitées en UTF-8 e PCRE_DOLLAR_ENDONLY Le caractère $ ne sera « réservé » que pour la fin de chaîne (sinon, $ correspond aussi aux fins de ligne) Par exemple : /(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/ ↪ voir http://www.expreg.com/options.php et http://fr.wikipedia.org/wiki/Expression_rationnelle Expressions régulières : symboles ^ Indique le début de la chaîne - exemple ^chat reconnaît une ligne qui commence par chat $ Indique la fin de la chaîne - exemple : chat$ reconnaît une ligne qui finit par chat . Le point indique n'importe quel caractère * Indique 0, 1 ou plusieurs occurrences du caractère ou de la classe précédente + Indique une ou plusieurs occurrences du caractère ou de la classe précédente ? Indique 0 ou une occurrence du caractère ou de la classe précédente [ ] [0-9] br[iu]n Délimiteur de classe : tous les caractères énumérés dans la classe - exemple : tous les caractères entre 0 et 9 - exemple : i ou u => trouve brun et brin - | Dans [ ] : - pour de … à …, | pour l’alternative , ^sauf le caractère qui suit ^ ↪ voir http://www.expreg.com/symbole.php Et http://fr.wikipedia.org/wiki/Expression_rationnelle Expressions régulières : caractères spéciaux (blancs, etc.) \n Indique le caractère qui code la « nouvelle ligne » \r Indique le caractère qui code le « retour chariot » ^ Indique le début de la chaîne - exemple ^chat reconnaît une ligne qui commence par chat $ Indique la fin de la chaîne - exemple : chat$ reconnaît une ligne qui finit par chat \b Indique une limite de mot dans une chaîne \d Indique un chiffre (caractère entre 0 et 9, donc identifque à [0-9] et [[:digit:]]) \D Indique la classe [^0-9], c’est-à-dire, qui n’est pas un chiffre \s Indique un espace blanc \t, \r, \n, \f \w Indique un mot ( correspond à [0-9a_zA-Z] ) ↪ voir http://www.expreg.com/symbole.php Et http://fr.wikipedia.org/wiki/Expression_rationnelle Expressions régulières : exemples de $regex • chat|chien : correspond aux chaînes de caractères « chat » ou « chien » (et seulement à celles-ci), n'importe où dans le texte (exemple : « chatte »). • [cC]hat|[cC]hien : correspond aux chaînes « chat », « Chat », « chien » ou « Chien » (et seulement à celles-ci), n'importe où dans le texte (exemple : « Chat » dans « Chats et chiens »). • chu+t : correspond à « chut », « chuut », « chuuut », etc., n’importe où dans le texte. • a[ou]+ : correspond à « aou », « ao », « auuu », « aououuuoou », etc., n’importe où dans le texte. • peu[xt]? : correspond à « peu », « peux » et « peut » (et seulement à ces chaînes , n’importe où dans le texte. La recherche retourne le texte le plus long possible en cas d’occurrences multiples à la même position). • ^[st]ac : représente les chaînes « sac » et « tac » en début de ligne. • [st]ac$ : représente les chaînes « sac » et « tac » en fin de ligne ou de texte (par exemple à l'intérieur de « ressac »). • ^trax$ : représente la chaîne « trax » seule sur une ligne. ↪ voir http://fr.wikipedia.org/wiki/Expression_rationnelle Expressions régulières : en mySQL Exemple : pour récupérer les valeurs définies pour le type ENUM ↪ voir http://dev.mysql.com/doc/refman/5.0/en/columns-table.html et http://dev.mysql.com/doc/refman/5.7/en/regexp.html 1 = TRUE ; 0 = FALSE Expressions régulières : en mySQL Exemple : pour rechercher des valeurs erronées dans une table, comme des textes qui qui contiennent une balise <img … /> dans une colonne « nom » ↪ voir http://dev.mysql.com/doc/refman/5.0/en/columns-table.html et http://dev.mysql.com/doc/refman/5.7/en/regexp.html Références QCM inspiré des questions des fiches de TD de tiprof http://tiprof.fr/PHP-mySQL/Travaux%20Dirig%C3%A9s/TD3-PHP-mySQL/ http://tiprof.fr/PHP-mySQL/Travaux%20Dirig%C3%A9s/TD4-Deploie/ http://tiprof.fr/PHP-mySQL/ressources/mysql/Resume_RequetesMySQL-et-PHP.html https://regex101.com/