p1aca481ktk3r14qe174..

publicité
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/
Téléchargement