Pourquoi un attaquant cible votre site ?
Toujours supposer que l'attaquant connait votre web et a les même outils que vous
Lorsque l'attaquant peut examiner des données, fichiers, etc qu'il ne devrait pas être autorisé à voir
loginfail.php, essayer loginsuccess.phpuser.php?id=123,
essayer user.php?id=456/data/public, essayer /data/privateQuand une faille permet a l'utilisateur d'injecter du code HTML arbitraire dans votre page

ERR_BLOCKED_BY_XSS_AUDITOR)):
question-reponse.html
reponse-non-sure.php?question=<b style="color:red">c'est pas juste du texte </b>
une faille où l'utilisateur est en mesure d'injecter et exécuter du code JavaScript arbitraire dans la page
reponse-non-sure.php?question=<script type='text/javascript'>alert('pouet !');</script>
<script type="text/javascript" src="http://panzi.github.com/Browser-Ponies/basecfg.js" id="browser-ponies-config"></script><script type="text/javascript" src="http://panzi.github.com/Browser-Ponies/browserponies.js" id="browser-ponies-script"></script><script type="text/javascript">/* <![CDATA[ */ (function (cfg) {BrowserPonies.setBaseUrl(cfg.baseurl);BrowserPonies.loadConfig(BrowserPoniesBaseConfig);BrowserPonies.loadConfig(cfg);})({"baseurl":"http://panzi.github.com/Browser-Ponies/","fadeDuration":500,"volume":1,"fps":25,"speed":3,"audioEnabled":false,"showFps":false,"showLoadProgress":true,"speakProbability":0.1,"spawn":{"applejack":1,"fluttershy":1,"pinkie pie":1,"rainbow dash":1,"rarity":1,"twilight sparkle":1},"autostart":true}); /* ]]> */</script>
htmlspecialchars
|
retourne la version HTML échappé d'une chaîne (attention à l'encodage "ISO-8859-1" vs "UTF-8"). |
$text = "<p> toi & moi </p>";
$text = <em> htmlspecialchars </em> ($text);
# "<p>toi & moi</p>"
htmlentities
est équivalent mais traduit tout les caractères qui ont un équivalent
en leur code html (e.g. À devient À)
La validation peut être faite:
<form action="http://foo.com/foo.php" method="get"> <div> nom: <input name="nom" id="nom" /> <br /> tel: <input name="tel" id="tel" size="10" maxlength="10" /> <br /> code postal: <input name="cp" id="cp" size="5" maxlength="5" /> <br /> <input type="submit" /> </div> </form>
Rappel: $_REQUEST est un tableau associatif qui contient par défaut le contenu des variables: $_GET, $_POST et
$_COOKIE.
$nom = $_REQUEST["nom"];
$tel = $_REQUEST["tel"];
$cp = $_REQUEST["cp"];
if (!$nom || strlen($tel) != 10 || strlen($cp) != 5) {
print "Erreur nom/tel/cp invalide.";
}
/^[a-zA-Z_\-]+@(([a-zA-Z_\-])+\.)+[a-zA-Z]{2,4}$/
/, telle que : "/[AEIOU]+/"| fonction | description |
|---|---|
preg_match(regex, string)
|
renvoie TRUE
si regexp reconnaît
(correspond à) string
|
preg_replace(regex, replacement, string)
|
renvoie une nouvelle chaine ou toutes les sous chaines qui correspondent à regex sont remplacé par replacement |
preg_split(regex, string)
|
à partir d'une chaine
initiale string, renvoie un
tableau de chaine obtenu en la découpant en morceau
en utilisant regex comme
délimiteur (généralisation de explode)
|
$tel = $_REQUEST["tel"];
if (!preg_match("/^[O-9]{10}$/", $tel)) {
print "Erreur. numéro invalide";
}
preg_match aide a valider les
paramètres /abc/
/ "abc":
"abc",
"abcdef",
"defabc",
".=.abc.=.",
...
"fedcba",
"ab c",
"PHP",
...
.. reconnaît tout caractère
sauf le saut de ligne \n
/.oo.y/ "match"
"Doocy",
"goofy",
"LooNy",
...
i à la fin de
l'expression (après le / fermant ) signifie une correspondance insensible à la casse
/mart/i reconnaît
"Martin Guerre",
"smart fellow",
"WALMART",
...
|, (), \|signifie OR
/abc|def|g/ "match" "abc", "def", ou "g"() servent à gouper
/(Homer|Marge)
Simpson/ reconnaît "Homer Simpson"
ou "Marge Simpson"\ débute une séquence d'échappemente
/ \ $ . [ ] ( ) ^ * + ?/<br \/>/
reconnaît les lignes contenant la balise<br /> *, +, ?* un nombre quelconque d'occurrence (0
ou plus)
/abc*/ "match" "ab", "abc", "abcc", "abccc", .../a(bc)*/ "match" "a", "abc", "abcbc", "abcbcbc", .../a.*a/ "match" "aa", "aba", "a8qa", "a!?xyz__9a", ...+ au moins une occurrence
/a(bc)+/ "match" "abc", "abcbc", "abcbcbc", .../Goo+gle/ "match" "Google", "Gooogle", "Goooogle", ...? 0 ou 1 occurrence
/a(bc)?/ "match" "a" ou "abc"{min,max}{min,max} signifie entre min et max occurrences (inclusif)
/a(bc){2,4}/ "match" "abcbc", "abcbcbc", ou "abcbcbcbc"{2,} signifie 2 ou plus{,6} signifie à partir 6{3} signifie exactement 3^ et $^ represente début d'une chaîne ou ligne; $ represente la fin
/olivier/
reconnaît
toutes les chaînes qui
contiennent Olivier; /^Olivier/
reconnaît toutes les chaînes qui
commencent par Olivier; /Olivier$/ reconnaît toutes les chaînes qui
finissent par Olivier; /^Olivier$/
reconnaît exactement la chaîne "Olivier"
/^O.*Pons$/
"match" "OlivierPons", "Olivier
Pons", "Olivier
Emmanuel Pons", ... "Olivier
Pons du Cnam"
ni "Prof. Olivier Pons"
/MOTIF/
reconnaît "texte", on veut dire
qu'il reconnaît toute chaîne qui contient ce texte)
[][] groupe des caractères
en une expression
reguliere ensemble
qui "match" n'importe
quel caractère de l'ensemble
/[bcd]art/ "match"
les chaînes contenant "bart", "cart", et "dart"/(b|c|d)art/ mais plus
court ![], la plupart des
"modificateurs" se comportent comme des caractères normaux
/quoi[!*?]*/ "match" "quoi", "quoi!", "quoi?**!", "quoi??!", .../[ACGT]+/[début-fin]-
/[a-z]/ "match"
toute minuscule/[a-zA-Z0-9]/ "match"
toute lettre (minuscule ou majuscule) ou chiffre^ au début d'un ensemble de
caractère exprime le complementaire de l'ensemble
/[^abcd]/ "match"
tout caractère autre qu' a, b, c, ou d-à l'interieur d'un
ensemble de caractère, il doit être échappé.
/[+\-]?[0-9]+/"match"
un + ou un -
optionnel , suivi par au moins un chiffre/[ABCDE][+\-]?/\d reconnaît tout chiffre
(équivalent à [0-9]);
\D tout ce qui
n'est pas un chiffre((
équivalent à [^0-9])
\w
reconnaît tout caractère alphanumérique(équivalent à
[a-zA-Z_0-9]);
\W tout caractère
non alphanumérique
\s reconnaît tout
espace (au sens large) ( , \t, \n, etc.);
\S tout ce qui
n'es pas un espace (au sens large)
/\$\d{3,}\.\d{2}/# remplacer les voyelles par des asterix $str = "the quick brown fox"; $str = preg_replace("/[aeiou]/", "*", $str); # "th* q**ck br*wn f*x" # decouper en mot $words = preg_split("/[ ]+/", $str); # ("th*", "q**ck", "br*wn", "f*x") # mettre en majuscule les mots qui ont 2 voyelles de consecutives for ($i = 0; $i < count($words); $i++) { if (preg_match("/\\*{2,}/", $words[$i])) { $words[$i] = strtoupper($words[$i]); } } # ("th*", "Q**CK", "br*wn", "f*x")
\ doit être echapper en \\string.match(regex)
nullvar name = $("name").value;
if (name.match(/[a-z]+/)) { ... }ipeut être placé après l'expression rationnelle pour une correspondance non sensible à la casse
name.match(/Olivier/i)
reconnaîtra "olivier", "OliVieR", ...string.replace(regex, "text")
var str = "Papa Poule";str.replace(/[a-z]/, "x") returns "Pxpa Poule"str = str.replace(/[a-z]/, "x")g peut être placé après l'expression
rationnelle pour une correspondance globale
(remplace toutesles occurrences)
str.replace(/[a-z]/g, "x") returns "Pxxx Pxxxx"str = str.replace(/[^A-Z]+/g, "") change str en "PP"
une faille où l'utilisateur est en mesure d'injecter des données SQL arbitraire dans votre requête
$query = "SELECT * FROM students WHERE username = '$username' AND password = '$password'";
$query = "SELECT * FROM students WHERE username = '$username' AND password = '' OR '1'='1'";
; DROP TABLE students; -- )
JOIN a JOIN b JOIN c ...)
mysql::real_escape_string
mysqli::real_escape_stringPDO::quote
|
renvoie une version "SQL-echappé" de la chaine |
$username = $db->quote($_POST["username"]); $password = $db->quote($_POST["password"]); $query = "SELECT name, ssn, dob FROM users WHERE username = $username AND password = $password";
'par \', etc.,
et entoure de guillemet
quand un "attaquant" écoute votre réseau et lit ou modifie les données
Lorsque l'attaquant capture votre ID de session et se fait passer pour vous