c5267ae26d749f6f6cf6e106ad77126419ee0a74
[hacks/simpleWebSlides.git] / unix_prog_web / unix_prog_web_09.xhtml
1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
4           >
5 <html xmlns="http://www.w3.org/1999/xhtml" >
6   <head>
7     <title>Notions de sécurité sur le Web</title>
8
9     <meta http-equiv="Content-Type"
10           content="text/html; charset=utf-8" />
11     <meta name="copyright"
12           content="Copyright &#169; 2013 Kim Nguyễn" />
13
14     <!-- Load jQuery -->
15     <script src="../jquery-2.0.3.min.js" type="text/javascript" ></script>
16     <script src="../libs/raphael-min.js" type="text/javascript" ></script>
17     <!-- Load the library -->
18     <script src="../simpleWebSlides.js" type="text/javascript" ></script>
19
20     <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
21     <!-- Load a custom Theme, the class-element marks this style-sheet
22          a "theme" that can be swtiched dynamicaly -->
23     <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
24
25     <!-- Customize some templates and initialize -->
26
27     <script type="text/javascript">
28       SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
29       SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
30       SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
31
32       //Ensures that we load SWS at the very end, after MathJax has
33       //been initialized
34
35       $(window).load(SWS.Presentation.init);
36     </script>
37   </head>
38   <body>
39     <a href="unix_prog_web_08.xhtml" class="sws-previous"/>
40     <div class="sws-slide sws-cover sws-option-nofooter">
41       <h1>Unix et Programmation Web</h1>
42       <h1>Cours 9</h1>
43       <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
44       <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
45     </div>
46
47     <h1>Faiblesses d'HTTP</h1>
48
49     <div class="sws-slide">
50       <h1><i>Disclaimer</i></h1>
51       <ul>
52         <li>Aborde juste quelques aspects de sécurité</li>
53         <li>Essaye de montrer quelques principes fondamentaux</li>
54         <li>Uniquement axé sur le Web</li>
55       </ul>
56       <p><b>&#8658;</b> Ça ne va pas faire de vous des <i>hackers</i>,
57       juste vous sensibiliser aux problèmes de sécurité…
58       </p>
59     </div>
60
61     <div class="sws-slide">
62       <h1>Élements de cryptographie (1)</h1>
63       <p>Alice et Bob veulent échanger des données
64       confidentielles.</p>
65       <ol style="list-style-type:none;">
66         <li>1.&nbsp;Chiffrement <s>symétrique</s>:
67           <ul>
68             <li>
69               Ils se mettent d'accord sur une <em>clé commune</em>
70             </li>
71             <li> Alice <em>chiffre</em> son message avec la clé et
72               l'envoie à Bob</li>
73             <li> Bob déchiffre le message avec <em>la clé</em>
74             </li>
75           </ul>
76           <p class="sws-pause">
77           <s>Non sûr</s> (Alice et Bob doivent se mettre d'accord sur une clé en
78           « clair », par email par exemple) ou <s>non pratique</s>
79           (ils doivent se rencontrer physiquement pour échanger la
80           clé).<br/>
81           <em>Efficace</em>: on peut implanter plusieurs algorithmes
82           de chiffrements en utilisant uniquement des opérations
83           logiques de bases
84           (<tt>AND</tt>, <tt>OR</tt>, <tt>XOR</tt>). Il est facile de
85           les implanter sur des puces dédiées (cartes de crédit,
86           processeurs mobiles). Ils sont « sûrs » tant que la clé
87           reste secrète.
88           </p>
89         </li>
90       </ol>
91     </div>
92     <div class="sws-slide">
93       <h1>Élements de cryptographie (2)</h1>
94       <p>Alice et Bob veulent échanger des données
95       confidentielles.</p>
96       <ol style="list-style-type:none;">
97         <li>2.&nbsp; Chiffrement <em>assymétrique</em>:
98           <ul>
99             <li>Bob crée une <em>clé
100             publique</em> <i>K<sup>B</sup><sub>pub</sub></i>
101               et une <em style="color:orange;">clé
102             secrète</em> <i>K<sup>B</sup><sub>priv</sub></i>, telle
103             que<div style="text-align:center">
104                 &#8704;<i>msg</i>, <i>K<sup>B</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>(<i>msg</i>))
105             = <i>K<sup>B</sup><sub>pub</sub></i>(<i>K<sup>B</sup><sub>priv</sub></i>(<i>msg</i>))
106             = <i>msg</i>
107               </div>
108               Bob <em>diffuse</em> sa clé publique (sur sa page Web
109               par exemple, ou dans un annuaire de clé) et garde sa clé
110               privée <em style="color:orange;">secrète</em>.
111             </li>
112             <li> Alice <em>chiffre</em> son message <i><s>m</s></i> avec la <em>clé
113               publique</em> de Bob
114               (<i>K<sup>B</sup><sub>pub</sub></i>(<i>m</i>)) et l'envoie à Bob
115             </li>
116             <li> Bob
117             déchiffre le message avec sa clé
118             privée: <i>K<sup>B</sup><sub>priv</sub>(K<sup>B</sup><sub>pub</sub></i>(<i>m</i>))=<s><i>m</i></s>
119             </li>
120           </ul>
121           <p class="sws-pause">
122           <s>Sûr et pratique</s> (Bob a généré une paire de clé, et a
123           déposé la clé publique sur une page Web)<br/>
124           <em>Peu efficace</em>: repose sur des problèmes
125           mathématiques difficiles (factorisation de grands entiers,
126           courbes eliptiques sur les corps finis). Chiffrer et
127           déchiffrer un message n'est pas réaliste pour des grands
128           messages (vidéo en streaming, requêtes Web, …).
129           </p>
130         </li>
131       </ol>
132     </div>
133     <div class="sws-slide">
134       <h1>Élements de cryptographie (3)</h1>
135       <p>On combine les deux méthodes. (Alice envoie un message à Bob)</p>
136       <ul>
137         <li>Alice choisit une <s>clé symétrique secrète <i>s</i></s></li>
138         <li>Elle l'envoie à Bob en utilisant la clé publique de ce
139         dernier (<i>K<sup>B</sup><sub>pub</sub></i>(<i>s</i>))
140         </li>
141         <li>Bob décrypte le message et
142           obtient <s><i>s</i></s>=<i>K<sup>B</sup><sub>priv</sub>(K<sup>B</sup><sub>pub</sub></i>(<i>s</i>))
143         </li>
144         <li>Bob et Alice se sont mis d'accord <em>de manière sûre</em>
145           sur une clé commune <s>s</s>! Ils peuvent utiliser un
146           algorithme de chiffrement symétrique pour le reste de la
147           conversation
148         </li>
149       </ul>
150       <p><b>&#8658;</b> Ceci est à la base de protocoles tels que HTTPS</p>
151     </div>
152
153     <div class="sws-slide">
154       <h1>Éléments de cryptographie (4)</h1>
155       <p>Le chiffrement assymétrique permet aussi d'avoir <em>la
156           preuve</em> que quelqu'un est bien Bob!</p>
157       <ul>
158         <li>Alice choisit un message secret aléatoire <i><s>m</s></i>,
159           sans le divulguer (appelé <i>challenge</i>)
160         </li>
161         <li>Alice
162           calcule <i>K<sup>B</sup><sub>pub</sub>(<i>s</i>)</i> et
163           l'envoie à la personne qui prétend être Bob
164         </li>
165         <li>Seule la personne qui possède la clé privée de Bob (donc
166           Bob …) peut déchiffrer le message et renvoyer l'original à
167           Alice.
168         </li>
169       </ul>
170       <p> <b>&#8658;</b> Comment garantir que la personne qui a généré
171         les clés <s>au départ</s> est bien Bob ?
172       </p>
173     </div>
174     <div class="sws-slide">
175       <h1>Une analogie</h1>
176       <p>La cryptographie assymétrique fonctionne exactement comme
177       l'analogie de la boîte aux
178       lettres. Pourquoi ?
179       </p>
180       <ul class="sws-pause">
181         <li>La clé publique est la boîte aux lettres</li>
182         <li>La clé privée est la clé de la boîte aux lettres</li>
183         <li>Tout le monde peut «crypter» un message en le glissant
184         dans ma boîte aux lettres</li>
185         <li>Une fois le message crypté (<i>i.e.</i> dans la boîte) il
186         est difficile de le récupérer sans avoir la clé</li>
187         <li>Il est facile pour moi d'ouvrir la boîte avec ma clé</li>
188       </ul>
189
190     </div>
191     <div class="sws-slide">
192       <h1>HTTP: protocole texte « en clair »</h1>
193       <p>HTTP est un protocole <em>texte</em>, les données ne sont
194       pas chiffrées (cf. TP3) et <em>sans identification</em></p>
195     <ul>
196       <li><em>Confidentialité</em> : n'importe qui (avec les
197         privilèges nécessaires) peut lire ce qui transite entre un client
198         et un serveur Web</li>
199       <li><em>Authenticité</em> : n'importe qui peut se faire passer
200         pour un serveur Web (attaque <i>man in the middle</i>)
201       </li>
202     </ul>
203   </div>
204     <div class="sws-slide">
205      <h1>Espionnage de connexion</h1>
206      <p>Alice représente le client, Bob le serveur et Eve (<i>Eavesdropper</i>)
207      l'attaquante</p>
208      <p>On suppose que <s>Eve</s> est <s>root</s> sur la
209      machine. Il suffit de lire les paquets qui transitent par la
210      carte réseau (<tt>tcpdump</tt> sous Linux).
211      </p>
212      <ul><li>Eve et Alice sont sur la même machine (démo):
213          <div style="text-align:center;vertical-align:middle;"><br/>
214            <span style="border:1pt solid gray;border-radius:
215            5pt;padding:5pt;font-size:larger;">A &nbsp;
216            &nbsp; <s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
217            0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
218            5pt;padding:5pt;font-size:larger;">B</span>
219
220          </div>
221        </li>
222        <li>Fonctionne aussi si Eve est sur une machine se trouvant
223        sur la route entre Alice et Bob:
224          <div style="text-align:center;vertical-align:middle;"><br/>
225            <span style="border:1pt solid gray;border-radius:
226            5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
227            0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
228            5pt;padding:5pt;font-size:larger;"><s>E</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
229            0 0 0;border-style:solid; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
230            5pt;padding:5pt;font-size:larger;">B</span>
231
232          </div>
233        </li>
234      </ul>
235      <p>Ce problème touche tous les protocoles en clair: HTTP, POP,
236      IMAP, FTP, …. Il peut être résolu grace au <em>chiffrement</em>
237      de toute la connexion.</p>
238     </div>
239     <div class="sws-slide">
240       <h1>Attaque <i>Man in the middle</i></h1>
241       <p><s>Mallory</s> se place entre Alice (cliente) et Bob (banque), par exemple au
242         moyen d'un <em>e-mail</em> frauduleux en HTML:</p>
243         <ol> <li> L'émail contient:
244           <code><![CDATA[  <html>
245    <body>
246        Bonjour,
247           veuillez vous connecter à votre banque en cliquant ici:
248            <a href=']]><s>mallory.com</s>' &gt;<em>www.bob.com</em><![CDATA[</a>
249     </body>
250 </html>]]></code>
251           </li>
252           <li>Alice, insouciante, clique sur le lien
253                  <div style="text-align:center;vertical-align:middle;"><br/>
254            <span style="border:1pt solid gray;border-radius:
255            5pt;padding:5pt;font-size:larger;">A</span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
256            0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
257            5pt;padding:5pt;font-size:larger;"><s>M</s></span><span style="display:inline-block;height:1ex;width:5em;border-width:1pt
258            0 0 0;border-style:dashed; border-color:gray"> </span><span style="border:1pt solid gray;border-radius:
259            5pt;padding:5pt;font-size:larger;">B</span>
260          </div>
261           </li>
262           <li>Mallory peut retransmettre les requêtes entre Bob et
263             Alice, en les modifiant au passage. Le problème est causé
264             par un manque d'authentification (Mallory n'a pas a
265             <em>prouver</em> à Alice qu'il est Bob)
266           </li>
267 </ol>
268     </div>
269     <div class="sws-slide">
270       <h1>Solution: HTTPS</h1>
271       <p>HTTP <em>Secure</em></p>
272       <ol> <li>Respose sur de la cryptographie assymétrique (pour
273       l'authentification et le partage de clé) et symétrique (pour le
274       chiffrement de connexion)</li>
275         <li>Permet d'authentifier les correspondants et de protéger
276         les données
277         </li>
278         <li>Suppose l'existence de <em>tiers de confiance</em> Alice
279         et Bob font confiance à Trent (<i>Trusted Third
280         Party</i>)</li>
281       </ol>
282       <p>Bob possède des clés publiques et privées
283       (<i>K<sup>B</sup><sub>pub</sub></i>
284       et <i>K<sup>B</sup><sub>priv</sub></i>), Trent possède des clés
285       publiques et privées (<i>K<sup>T</sup><sub>pub</sub></i>
286       et <i>K<sup>T</sup><sub>priv</sub></i>)
287       </p>
288     </div>
289     <div class="sws-slide">
290       <h1>HTTPS (détail du protocole)</h1>
291       <p>Bob et Trent <em>se rencontrent</em>. Trent <em>signe</em>
292         la clé publique de Bob en calculant
293         <div style="text-align:center">
294            <i>S<sup>B</sup></i>=<i>K<sup>T</sup><sub>priv</sub></i>(<i>K<sup>B</sup><sub>pub</sub></i>)
295         </div>
296         Comme Trent utilise sa clé <em>privée</em> on sait que seul
297         Trent a pu générer cette signature. De plus, Trent
298         a <em>rencontré</em> Bob donc il <em>certifie</em> que la
299         clé <i>K<sup>B</sup><sub>pub</sub></i> appartient bien à
300         quelqu'un nommé Bob.
301       </p>
302       <ol>
303         <li>Alice (client) veut se connecter à Bob. Bob fournit  sa
304         clé publique <i>K<sup>B</sup><sub>pub</sub></i> et la
305         signature <i>S<sup>B</sup></i></li>
306         <li> Alice contacte Trent (en qui elle a confiance) et récupère sa clé
307           publique <i>K<sup>T</sup><sub>pub</sub></i>. Elle déchiffre la
308           signature: <i>K<sup>T</sup><sub>pub</sub></i>(<i>S<sup>B</sup></i>)
309           et vérifie qu'elle retombe bien sur la clé publique de Bob.
310         </li>
311         <li>Elle peut alors choisir une clé symétrique, la chiffrer
312         avec <i>K<sup>B</sup><sub>pub</sub></i> et entammer une
313         communication <em>chiffrée</em> et <em>authentifiée</em> avec
314         Bob.</li>
315       </ol>
316 </div>
317     <div class="sws-slide">
318       <h1>Tiers de confiance</h1>
319       <p>Les tiers de confiance sont des entités (états, associations,
320       compagnies privées) qui se chargent de vérifier les clés
321         publiques d'autres entitées. C'est une
322       vérification <em>physique</em> (documents administratifs, …).
323       </p>
324       <div style="text-align:center"><img style="width:70%" src="ssl-cert.png" alt="ssl"/>
325       </div>
326       <p style="background:white">Cette erreur s'affiche quand une signature n'est pas conforme
327       ou n'a pas pu être vérifiée</p>
328     </div>
329
330     <div class="sws-slide">
331       <h1>Tiers de confiance</h1>
332       <p>Attaques contre les <em>authorités de certifications</em>
333         (tiers de confiance): difficiles, mais pas impossible. Certains
334         tiers de confiance sont douteux (états voyous, compagnie
335         piratées dont les clées <s>privées</s> sont compromises,…)<br/>
336         <s>Attaques d'implémentation</s> (plus probables) : on
337         exploite un <s>bug</s> dans le code des serveurs web ou des
338         navigateurs<br/>
339         <s>Autres faiblesses</s>: HTTPS est en « haut » dans la pile
340         IP (application). On peut donc avoir connaissance du nombre de
341         paquet échangés, des adresses IP des participants, la taille
342         et la fréquence des paquets… (même si on n'en connait pas le
343         contenu). Cela permet certaines attaques statistiques ou de deni
344         de service (DoS).
345       </p>
346     </div>
347     <div class="sws-slide">
348       <h1>Bug dans HTTPS: <i>Heartblead</i></h1>
349       <p><i>Heartblead</i> est un bug découvert en 2014 dans la
350         bibliothèque OpenSSL (Bibliothèque qui implémente toutes les
351         primitives cryptographiques de bas niveau nécessaire à HTTPS,
352         entre-autres, et utilisée par tout le monde). Cette attaque
353         touche la partie <i>heartbeat</i> du
354         protocole. Le <i>heartbeat</i> est un message périodique
355         envoyé par le client au serveur pour lui demander si la
356         connexion/session est toujours active (ou pour lui signaler de
357         ne pas la fermer).
358       </p>
359       <ul>
360         <li class="sws-pause">Serveur, es-tu vivant ? si oui répond 'Bonjour' (6
361         lettres)</li>
362         <li class="sws-pause">Bonjour</li>
363         <li class="sws-pause">Serveur, es-tu vivant ? si oui répond
364         'Je suis là' (10 lettres)</li>
365         <li class="sws-pause">Je suis là</li>
366         <li class="sws-pause">Serveur, es-tu vivant ? si oui répond
367         'Oui' (1024 lettres)</li>
368         <li class="sws-pause">Oui<span class="sws-pause"
369         style="color:gray;"><tt>....Serveur, je suis l'admin, modifie le
370         mot de passe à '1023hasd834!' ... Tiens, autre client, je
371         t'envoie la page que tu m'as demandée ... &lt;html&gt;&lt;body ....</tt></span></li>
372       </ul>
373     </div>
374     <h1>Confidentialité, traîtement des <i>cookies</i></h1>
375     <div class="sws-slide">
376       <h1>Traçage par cookies</h1>
377       <p><i>Normalement</i>, un <em>cookie</em> ne peut être
378       lu <em>que</em> que par le site émetteur (cf. cours 8). But:</p>
379       <ol class="sws-pause">
380         <li>Empêcher un tiers de lire des données personnelles
381         (<em>ok</em>)</li>
382         <li>Empêcher un tiers de savoir quels sites ont été visités
383         (<em>pas ok</em>)</li>
384       </ol>
385       <ol>
386         <li class="sws-pause">Un site B utilise des publicités pour se rémunérer. Le
387         site marchand <s>M</s> fournit du code HTML:
388           <code>   &lt;script src="http://marchand.com/pub.js"/&gt; </code>
389         </li>
390         <li class="sws-pause">A visite le site B. Le
391           code <tt>pub.js</tt> peut alors faire les choses suivantes:
392           <ol>
393             <li>Scanner le contenu de la page de B. Possible car le
394               script est « inclus »  dans une page fournie par B</li>
395             <li>Se connecter
396               à<s><tt>http://marchand.com/collecte.php</tt></s> et
397               passer en paramètre <tt>post</tt> ou <tt>get</tt> le
398               contenu de la récolte</li>
399             <li><tt>http://marchand.com</tt> peut alors stocker un
400               cookie valide <em>pour son domaine</em> avec le contenu de
401               la récolte d'information
402             </li>
403           </ol>
404         </li>
405         <li class="sws-pause">
406           Lorsque A visite le site marchand <s>M</s>, ce dernier
407           relit son cookie et fait des propositions ciblées.
408         </li>
409
410       </ol>
411     </div>
412     <div class="sws-slide">
413       <h1>Solutions</h1>
414       <ul>
415         <li>Désactiver les cookies de « tierce partie » (cookie dont
416           l'origine n'est pas celle de la page visitée)
417         </li>
418         <li> Effacer par défaut tous les cookies quand on quite le
419           navigateur</li>
420         <li>Rajouter des exceptions pour certains sites au cas par cas
421         </li>
422       </ul>
423       <p>Nouveau standard du W3C en préparation pour signifier à un
424         site qu'on ne souhaite pas être suivi (méthode « volontariste
425         » qui suppose que les sites commerciaux sont gentils et
426         respectent le protocole)</p>
427     </div>
428     <div class="sws-slide">
429       <h1>Sécurité des cookies de session</h1>
430       <p>On a vu que les sessions PHP (vrai aussi pour les autres
431       langages côté serveur) stockent dans un cookie un identifiant
432       unique. Que se passe-t-il si on vole ce cookie ? (démo)
433       </p>
434       <p class="sws-pause">Pas d'autre solution que de faire confiance
435       au <s>root</s> (solutions partielles basées sur le chiffrement
436       des disques dur)
437       </p>
438     </div>
439     <h1>Attaques par injection de code</h1>
440     <div class="sws-slide">
441       <h1>Injection de code Javascript/HTML</h1>
442       <p>Vulnérabilité: on exploite le fait qu'un site <s>utilise
443           directement</s> les entrées fournies par l'utilisateur.<br/>
444         Exemple: commentaires sur un blog.
445       </p>
446       <ol>
447         <li>Une page Web utilise un formulaire pour permettre de
448         poster des commentaires sur un blog:
449           <code><![CDATA[
450    <form action="comment.php" method="post">
451      Commentaire: <br/>
452      ]]><em>&lt;textarea rows="20" cols="60"  name="zonetexte"/&gt;</em><![CDATA[
453     <br/>
454     <button type="submit">Envoyer</button>
455 </form>]]></code>
456           </li>
457         <li>Un bout de code PHP écrit le commentaire sur la page:
458           <code>    echo "Commentaire #$i: &lt;p&gt;";
459      <s>echo $_POST["zonetexte"];</s>
460      echo "&lt;/p&gt;";
461 </code>
462 </li>
463
464
465       </ol>
466     </div>
467     <div class="sws-slide">
468       <h1>Injection de code Javascript/HTML</h1>
469       <s>Problème</s> tout ce qui est dans la zone de texte est copié
470       dans la page HTML de chaque client qui consulte la page
471       et <s>interprété</s> par son navigateur:
472       <code>Debut du commentaire
473         <s>&lt;script type="text/javascript"&gt;</s>
474           ... //code javascript malicieux
475         <s>&lt;/script&gt;</s>
476         Fin du commentaire
477       </code>
478     </div>
479     <div class="sws-slide">
480       <h1>Injection de code PHP</h1>
481       <p><s>Problème</s> lié à l'utilisation de la fonction
482         <code>                    <s>eval</s>($code)</code>
483         <tt><em>$code</em></tt> est une chaîne de caractères
484         considérée comme étant du code PHP et <tt>eval</tt> exécute
485         cette chaîne:
486       </p>
487       <code>
488         echo eval ("1 + 2 * 3");  // affiche 7
489         echo eval ('$x = 4;');    // définit la variable $x
490         echo $x;                  // affiche 4
491       </code>
492       <p>Il ne faut <s>jamais donner une chaine de caractère de
493       l'utilisateur comme argument à <tt>eval</tt></s> (sauf durant le
494         TP 9)</p>
495     </div>
496     <div class="sws-slide">
497       <h1>Solutions</h1>
498       <ul>
499         <li>Ne jamais <s>utiliser <tt>eval</tt></s></li>
500         <li>Utiliser la fonction <tt>htmlspecialchars</tt> qui
501         échappe les
502         caractères <tt>&lt;</tt>,  <tt>&gt;</tt>,  <tt>&amp;</tt>, <tt>&apos;</tt>,  <tt>&quot;</tt></li>
503         <li>Utiliser la fonction <tt>striptags</tt> qui supprime tout
504         ce qui est une balise</li>
505         <li>Toujours valider les entrées d'un utilisateur</li>
506       </ul>
507     </div>
508     <div class="sws-slide">
509       <h1>Injection de code SHELL (en PHP)</h1>
510       <p><s>Problème</s> lié à l'utilisation de la fonction
511         <code>                    <s>exec</s>($command, &amp;$output)</code>
512         Cette fonction exécute dans un SHELL la
513         commande <tt>$command</tt>. Les lignes de la sortie standard
514         de la commande sont placées dans le table <tt>$output</tt>
515         passé en référence. (Démo avec <tt>unzip -l</tt>).<br/>
516         Solutions:
517       </p>
518       <ul>
519         <li>Ne jamais passer à exec directement une chaîne crée par
520         l'utilisateur</li>
521         <li>Recréer sois-même la chaîne de caractères, échapper les
522         caractères spéciaux et remettre le tout dans une chaîne pour
523         éviter les expansions du SHELL</li>
524         <li>Utiliser des fonctions de la bibliothèque standar quand
525         elle existes (par exemple <tt>rename</tt> plutot
526         que <tt>exec('mv ...')</tt>).</li>
527       </ul>
528     </div>
529     <div class="sws-slide">
530       <h1>Injection de code SQL</h1>
531       <p>SQL: language de requête permettant d'interroger des bases de
532         données. Utilisation classique depuis PHP (on suppose un
533         formulaire qui met dans le champ <tt>"nom"</tt> le nom d'un
534         étudiant):
535       </p>
536       <code>
537         $Q = <em>"SELECT * FROM STUDENTS WHERE "</em>;
538         $Q = $Q . <em>"(NAME = '"</em> . $_POST["nom"] . <em>"');"</em>;
539         mysql_query($Q);
540         </code>
541       <p>Si l'utilisateur donne comme nom « Toto », la requête envoyée
542       à la base est: </p>
543       <code>     SELECT * FROM STUDENTS WHERE (NAME = 'Toto');</code>
544       <p>Affiche toutes les lignes de la table <tt>STUDENTS</tt> pour
545       lesquel le nom est <tt>Toto</tt></p>
546     </div>
547     <div class="sws-slide">
548       <h1>Jusqu'au jour où …</h1>
549       <p>©xkcd<br/>
550         <img style="width:90%" src="xkcd.png" alt=""/>
551       </p>
552       <code>          <em>SELECT * FROM STUDENTS WHERE (NAME ='</em><s>Robert');</s>
553           <s>DROP TABLE STUDENTS; --</s><em>');'</em>
554
555     </code>
556     </div>
557     <div class="sws-slide">
558       <h1>Ou bien…</h1>
559       <div style="text-align:center;">
560       <img style="width:70%" src="radar.jpg" />
561       </div>
562     </div>
563   </body>
564 </html>