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.php
user.php?id=123
,
essayer user.php?id=456
/data/public
, essayer /data/private
Quand 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)
null
var name = $("name").value;
if (name.match(/[a-z]+/)) { ... }
i
peut ê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_string PDO::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 guillemetquand 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