diff --git a/rendu.md b/rendu.md
index 13a65771f28a1996c7c7a9052b84b0632209f896..f0a2d0265cd203997bb04d5d994c8575ec361f0b 100644
--- a/rendu.md
+++ b/rendu.md
@@ -49,12 +49,23 @@ Si le test échoue, je renvois une string indiquant une erreur 400. (mauvaise re
## Question 5
* Commande curl pour afficher une fenetre de dialog.
+´´´
+curl 'http://127.0.0.1:8080/' --data-raw "chaine=%3Cscript%3Ealert%28%22hello%22%29%3C%2Fscript%3E&submit=OK"
+´´´
* Commande curl pour lire les cookies
+curl 'http://127.0.0.1:8080/' --data-raw "chaine=%3Cscript%3E%0D%0Adocument.cookie+%3D+%22username%3DJohn+Doe%22%3B+%0D%0Aalert%28document.cookie%29%3B%0D%0Adocument.location.replace%28%22http%3A%2F%2F127.0.0.1%3A8090%22%29%3B%0D%0A%3C%2Fscript%3E&submit=OK"
+
## Question 6
Rendre un fichier server_xss.py avec la correction de la
faille. Expliquez la demarche que vous avez suivi.
+La correction du serveur.py pour la faille xss est exactement la même que pour l'injection sql.
+On fait d'abord passer l'entrée utilisateur de l'input par un regex. (Ce qui échappe les caractères spéciaux).
+un regex spécial pour une faille xss est d'échapper la balise script ainsi: re.search("^<script>", postChaine) et de tester un if contraire ('!')
+pour à tout prix éviter d'injecter une balise <script> dans le code.
+Puis on exécute la requete sql avec un paramètre de type string sécurisé.
+
diff --git a/server_xss.py b/server_xss.py
new file mode 100755
index 0000000000000000000000000000000000000000..0c0ee1e9d2746d13340cc37436bd66de548c96ba
--- /dev/null
+++ b/server_xss.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python3
+
+import mysql.connector
+import cherrypy
+import config
+import re
+
+class VulnerableApp(object):
+ def __init__(self):
+ self.conn = mysql.connector.connect(host=config.DB_HOST, user=config.DB_USER, database=config.DB_NAME, password=config.DB_PASS)
+
+ @cherrypy.expose
+ def index(self, **post):
+ cursor = self.conn.cursor()
+ if cherrypy.request.method == "POST":
+ # requete = "INSERT INTO chaines (txt,who) VALUES('" + post["chaine"] + "','" + cherrypy.request.remote.ip + "')"
+ # print("req: [" + requete + "]")
+ # cursor.execute(requete)
+ #https://realpython.com/prevent-python-sql-injection/
+ postChaine = post["chaine"]
+ x = re.search("^[a-zA-Z0-9]+$", postChaine)
+
+ if x:
+ cursor.execute("INSERT INTO chaines (txt,who) VALUES(%s, %s)", (postChaine, cherrypy.request.remote.ip))
+ self.conn.commit()
+ else:
+ cursor.close()
+ return "Error 400, bad query\n"
+
+
+ chaines = []
+ cursor.execute("SELECT txt,who FROM chaines");
+ for row in cursor.fetchall():
+ chaines.append(row[0] + " envoye par: " + row[1])
+
+ cursor.close()
+ return '''
+<html>
+<head>
+<title>Application Python Vulnerable</title>
+</head>
+<body>
+<p>
+Bonjour, je suis une application vulnerable qui sert a inserer des chaines dans une base de données MySQL!
+</p>
+
+<p>
+Liste des chaines actuellement insérées:
+<ul>
+'''+"\n".join(["<li>" + s + "</li>" for s in chaines])+'''
+</ul>
+</p>
+
+<p> Inserer une chaine:
+
+<form method="post" onsubmit="return validate()">
+<input type="text" name="chaine" id="chaine" value="" />
+<br />
+<input type="submit" name="submit" value="OK" />
+</form>
+
+<script>
+function validate() {
+ var regex = /^[a-zA-Z0-9]+$/;
+ var chaine = document.getElementById('chaine').value;
+ console.log(regex.test(chaine));
+ if (!regex.test(chaine)) {
+ alert("Veuillez entrer une chaine avec uniquement des lettres et des chiffres");
+ return false;
+ }
+ return true;
+}
+</script>
+
+</p>
+</body>
+</html>
+'''
+
+
+cherrypy.quickstart(VulnerableApp())
+