/Travaux Dirigés/TD4-Deploie

Sécurisation - Déploiement

  

28 janvier 2014

Objectifs

Il s'agit ici de traiter les pb liés au déploiement :

Exercices

Exercice 1 :

Travail local et distant

Pour des explications sur...

Exercice 2 :

Export / Import de la base de données

  1. Visiter la page de phpmyadmin sur le serveur local et se connecter ;
  2. Utiliser l'outil "Exporter" pour récupérer tout le code mySQL capable de sauvegarder en "texte" votre table, et de la reconstruire sur un autre serveur.
    Par exemple, suite aux manipulations illustrées par les copies d'écran ci-dessus, l'export en mySQL a donné le code ci-contre ;
  3. Visiter la page de phpmyadmin sur le serveur distant et se connecter …
  4. Utiliser l'outil "SQL" pour y COLLER tout le code mySQL récupéré précédemment.
    Cette méthode peut-elle fonctionner quand il y a des milliers de données ?
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

--
-- Structure de la table `DD__contacts`
--
CREATE TABLE `DD__contacts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `titre` enum('Mme','Mlle','M.','Dr') DEFAULT NULL,
  `nom` varchar(30) NOT NULL,
  `prenom` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=72 ;

--
-- Contenu de la table `DD__contacts`
--
INSERT INTO `DD__contacts` (`id`, `date`, `titre`, `nom`, `prenom`) 
VALUES
(1, '2014-02-14 09:08:39', 'Mme', 'Bistouille', 'Tara'),
(2, '2014-02-14 09:08:39', 'Dr', 'Bouzouck', 'Bachy'),
(3, '2014-02-14 09:08:39', 'M.', 'Gali', 'Peet')
;

Pour vous aider, consulter : http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/07_MySQL-et-connectPhp/ImportExport-MySQL.html

Exercice 3 : pb du /

Le problème de / dans les textes transmis en valeur de formulaire.

Cet exercice s'appuie sur un code de formulaire mémorisant un contenu dans un fichier plutôt qu'une base de données, pour bien "séparer" les problèmes.

  1. Reprendre les codes d'un formulaire précédent
  2. Répondre aux questions suivantes :
    • Quelle est la méthode appelée pour transmettre les informations du formulaire ?
    • A quelle URL est soumis le formulaire ?
    • Que se passe-t-il quand on lance plusieurs fois de suite le formulaire avec un contenu à transmettre qui contient le caractère ' ?
    • Que se passe-t-il quand on soumet le formulaire avec le texte :
        <img src=http://tiprof.fr/PHP-mySQL/_images/travaux.gif onload=javascript:alert() />
      Pour éviter de taper ce code cliquer sur résultat de la requête avec <img src=..../travaux.gif onload=javascript:alert() /> )
      - réponse : une alerte surgit dans le navigateur : le code javascript:alert() a été exécuté par le navigateur.
    • Idem avec le texte :
        <img src="http://tiprof.fr/PHP-mySQL/_images/travaux.gif" onload=javascript:alert() />
      ... cliquer sur la requête avec <img src="..../travaux.gif" onload=javascript:alert() /> )
      L'alerte s'est-elle aussi affichée dans le navigateur ?
      - réponse : non si le texte a été transformé en ajoutant des anti-slashes devant les quotes, car alors la syntaxe HTML n'était plus correcte en revenant dans la page affichée par le navigateur.
    • Idem avec le texte :
        <a href=javascript:alert() > YES !<a>
      ... cliquer sur la requête avec <a href=javascript:alert() > YES !<a> )
      - réponse : l'alerte surgit quand on clique sur le lien affiché dans le contenu : le code <code>javascript:alert()</code> a été exécuté par le navigateur.
    • Idem avec le texte :
        <iframe src=http://zythom.blogspot.fr/2013/09/cracker-les-mots-de-passe.html > <iframe>
      ... cliquer sur la requête avec <iframe src=http://zythom.blogspot.fr/2013/09/cracker-les-mots-de-passe.html > <iframe> )
      - réponse : la page renvoyée par "tiprof" contient une iframe qui inclut un contenu décidé par le visiteur (pouvant être de la publicité, au moins pire...).
    • Idem avec le texte :
        <img src=http://zythom.blogspot.fr/2013/09/cracker-les-mots-de-passe.html onload=document.location.href=this.src; />
      ... cliquer sur la requête avec <img src=http://zythom.blogspot.fr/2013/09/cracker-les-mots-de-passe.html onload=document.location.href=this.src; /> )
      - réponse : la page renvoyée par "tiprof" contient une image auquel est associé une événement du navigateur qui associe au chargement de l'image une action, cette action étant de remplacer l'URL visitée par celle d'un autre site
    • Faut-il "protéger" les quotes dans le textes transmis par les formulaires ?
  3. Chercher dans la documentation sur PHP ce que font les fonctions :
    • defined()
    • define()
    • fopen()
    • feof()
    • fgets()
    • fclose()
    • fwrite()
  4. Créer un fichier form_text.php et y coller le code PHP du formulaire ci-dessus ; créer un dossier nommé _include, y crée un fichier fonctions-v1.php et y coller le code des fonctions litfich() et sauvfich() donnés ci-dessus ;
  5. Tester le comportement de ce formulaire en local, et comparer avec l'effet de ces codes dans l'hébergement de la page courante. Il se peut que le résultat sur les ' soit différent, puisque cela dépend de la configuration de PHP sur le serveur.
  6. Dans l'hébergement de ces pages, le fichier php.ini contient les lignes suivante :
    Chercher le fichier php.ini sur votre installation locale de serveur HTTP.
  7. Répondre par Vrai ou Faux et justifier la réponse :
    • Les simples et doubles apostrophes doivent être "échappées" avant d'être envoyées au serveur de bases de données.
    • Les simples et doubles quotes des textes mémorisés dans une base de données doivent être "échappées" quand elles sont insérées dans un flux HTML.

Pour vous aider, consulter http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/

Exercice 4 :

Le problème de l'attaque par injection SQL.

Pour cet exercice, on considère que le code minimal de gestion de données d'une table de base de données avec un formulaire, est acquis.

  1. Créer un fichier, nommé cmpAskConnect.php, avec le contenu suivant, en incluant le fichier de connexion adapté à votre configuration locale pour l'API mysql. :
  2. Répondre aux questions suivantes :
  3. Chercher dans la documentation sur PHP ce que font les fonctions :
    • sprintf()
    • get_magic_quotes_gpc()
    • stripslashes()
    • addslashes()
    • var_dump()

Pour des explications sur... consultez http://www.php.net/manual/fr/function.mysql-real-escape-string.php

Exercice 5 :

Le problème de l'introduction de codes malveillants dans une base de données.

Cet exercice s'appuie sur un code de formulaire mémorisant un contenu dans un fichier plutôt qu'une base de données, pour bien "séparer" les problèmes.

  1. Recharger le formulaire de l'exercice sur le pb sur /, qui mémorise directement le contenu transmis, en visitant le lien suivant : Soumission du contenu avec <script...> , puis recharger la page qui affiche le contenu mémorisé dans une page HTML
    où le texte enregistré dans le contenu mémorisé est un code javaScript, le langage de script exécuté par le navigateur :
    <script  type="text/javascript">
    var duration= 2*60*1000; /* days*24hours*60minutes*60seconds*1000milliems */
    var date = new Date();
    date.setTime(date.getTime()+duration);
    var expires = "; expires=" + date.toGMTString();
    
    var nameCook = "test="
    document.cookie = nameCook+"vol de Session (par wally, jusqu'à "+date.toGMTString()+")"+expires+"; path=/";
    
    var listCook = document.cookie.split(';')  
    var c = listCook[0]
    
    for(i=0;((i < listCook.length) || (c.indexOf(nameCook) == 0));i++) {
      c = listCook[i]
      while (c.charAt(0)==' ') c = c.substring(1,c.length)
      if (c.indexOf(nameCook) == 0) window.alert("Le cookie '"+nameCook+"' vaut : "+c.substring(nameCook.length,c.length))
    }
    </script>
  2. Expliquer pourquoi le navigateur affiche une boite de dialogue, et à quelles informations le visiteur a accès par cette technique
  3. Essayer la même manipulation que la précédente, mais avec le texte :
    <script  type="text/javascript">
    function request(value) {
    	var xhr = false;
    	if (!xhr && typeof XMLHttpRequest != 'undefined') {
    	   try {
    	      xhr = new XMLHttpRequest();
    	   } catch (e) {
    	      xhr = false;
    	   }
    	}
    	xhr.onreadystatechange = function() {
    		if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
    			//readData(xhr.responseXML);
    			readData(xhr.responseText);
    		} else if (xhr.readyState < 4) {
    			document.getElementById("contenu").style.color = "red";
    		}
    	};
    	xhr.open("POST", value, true);
    	xhr.setRequestHeader("Content-Type", "text/plain");
    	xhr.send("param");
    }
    function readData(oResp) {
    	var oInject = document.getElementById("contenu");	
    	oInject.innerHTML = oResp;
    	var allScripts=content.getElementsByTagName("script");
    	for (var i=0; i<allScripts.length; i++) {
    	  var s=allScripts[i];
    	  if (s.src && s.src!="") {
    		alert(s.src);
    		eval(getFileContent(s.src));
    	  } else {
    		eval(s.innerHTML);
    	  }
    	} 
    }
    </script>
    <img src="http://tiprof.fr/PHP-mySQL/_images/travaux.gif"
    onload="javascript:request('_PLAN.txt')" /> 
  4. Que fait le navigateur cette fois quand on recharge la page HTML incorporant le nouveau contenu
  5. Essayer la même manipulation que la précédente, mais avec le texte :
    <input id="file" type="file" />
    <script  type="text/javascript">
    var fileInput = document.querySelector('#file');
    fileInput.onchange = function() {
        var reader = new FileReader();
        reader.onload = function() {
            alert('Contenu du fichier "' + fileInput.files[0].name + '" :\n\n' + reader.result);
        };
        reader.readAsText(fileInput.files[0]);
    };
    </script>
    
  6. Que fait le navigateur cette fois quand on recharge la page HTML incorporant le nouveau contenu
  7. Est-ce "dangereux" pour la sécurité du serveur ?
  8. Reprendre les codes du formulaire lié à un fichier de l'exercice sur le pb sur /.
  9. Modifier le code pour refuser d'insérer des contenus contenant des balises (comme <a... ou <script...) et afficher un message expliquant ce refus.

    Pour comprendre pourquoi refuser de mémoriser ce type de contenu, lire : http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/ Conseil : utiliser la fonction strpos()

Pour vous aider, consulter http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/ et la documentation sur la fonction strpos()

Exercice 6 :

Aider le référencement

Pour vous aider, consulter : http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/07_MySQL-et-connectPhp/ImportExport-MySQL.html

Des liens

Pour vous aider, vous pouvez consulter :

Quelques pb de sécurité dans la gestion des formulaires sont expliqués ici avec des codes pour protéger son site
http://www.tiprof.fr/SitesWebDynamic/Techniques-swd/mat%C3%A9riel/pageauto/
La page en français de la référence sur mySQL décrit tous les types succintement
http://dev.mysql.com/doc/refman/5.1/en/integer-types.html.
remonter revenir
LicPro - PAGORA