Quelques astuces pour sécuriser son site

5 mai 2013 nakama

Développement

(Cet article a été écrit il y a très longtemps, dans une galaxie très très lointaine)

Comme beaucoup, la sécurité de son site Internet est un élément très important !

Je ne vais pas vous dire ce qu’il doit être fait pour avoir une protection 100% efficace ^^ car ça n’existe pas, mais je vais plutôt mettre en avant des bonnes pratiques à avoir afin de minimiser les risques.

Savoir ce qu’on manipule ?

Avant de commencer à coder n’importe quoi 🙂 il faut tjs s’assurer de ce que contient la variable qui va être utiliser (entier ? float ? string ? etc…)

$number = "5"; // string
$number = 5; // integer
$number = 5.2; // float

$boolean = true // Boolean 

// il est possible de 'forcer' le type
$number0 = (int) "5"; // interger
$number1 = (string) 5; // string

// php n'a pas de problème pour les calcules entre int et string
// du moment que ce sont des chiffres
$result = $number0 + $number1; // 10

Maintenant que la variable est bien configurée, on peut utiliser des fonctions natives de php pour tester si la variable contient réellement ce que nous voulons.

$number = (int) 5;

if(is_numeric($number))
	echo "C'est bien un nombre";

$string = (string) "Hello";

if(is_string($string ))
	echo "C'est bien un string";

is_numeric détermine si la variable donnée est de type numérique.
is_string détermine si la variable donnée est de type chaîne de caractères.

Formulaire

Quand on utilise un formulaire sur son site, on aimerait pouvoir le sécurisé un maximum.

// le message qu'un internaute peut écrire ^^
$var = '
	<html>
		<p>texte<strong>power</strong></p>
		<a href="#">Lien</a>
		<script>$("#exemple").css({display : "none"});</script>
		<script>$("#exemple").css({display : "none"});</script>
		<script>$("#exemple").css({display : "none"});</script>
		<script>$("#exemple").css({display : "none"});</script>
		<script>$("#exemple").css({display : "none"});</script>
		<?php header("Location: login.php"); ?>
	</html>';

// on supprime tout le javascript
$search = array('@<script[^>]*?>.*?</script>@si');
$text = preg_replace($search, '', $var); 

// on conserve uniquement les balises souhaités
$msgSain = strip_tags($text, '<strong><a>');

strip_tags est très utile, cette fonction permet de conserver uniquement le texte et supprime les balises (html et php). En 2e argument, il est possible de dire quelles balises conserver.

Ici, les balises strong et a seront gardés tandis que toutes les autres balises seront supprimées. Dans notre exemple, il ne restera que le texte, la balise strong avec son contenu et la balise a avec son contenu.

Et si on veut crypter des choses ? on fait comment ?

Il existe beaucoup de fonctions de php pour crypter le contenu d’une variable (md5 et sha1 les plus connus je pense) :

echo md5('bonjour'); // f02368945726d5fc2a14eb576f7276c0
echo md5_file('secu.php'); // aa47307f9dcac289e537e09d386de535
echo sha1('bonjour'); // 1f71e0f4ac9b47cd93bf269e4017abaab9d3bd63
echo sha1_file('secu.php'); // f8a67d156704e7d13a44da25eb357c0b893b9c5b
echo crypt('bonjour'); // $1$cd3./u3.$FYFxMhKQlQfVA9kWrA0l01

// crypt génère une chaine différente pour chaque actualisation.

MD5 et SHA1 génèrent une chaine fixe ! Donc en soit il est possible de revenir en arrière. Évidemment, il n’existe pas de fonction qui le permet (heureusement) mais il existe sur le Web des bases de données de mots crypter avec ces méthodes.

C’est pourquoi, ces méthodes ne sont pas à utiliser seul ! Vous devez ajouter votre mot qui va ce coupler avec celui à crypter (vous avez probablement déjà entendu le terme SALT).

$salt = "MARK-42"; // pour les fan d'Iron man :)
$mdp = $salt."bonjour";
echo sha1($mdp); // 873549913d525bfc9a14ea1ab00c427f8e14e963

Comme vous pouvez le voir, la chaine crypter en sha1 est totalement différente de la précédente. Du coup, il est ‘un peu’ plus compliqué de trouver le bon mot.

Il existe une autre fonction php que j’aime tout particulièrement, car elle donne la possibilité de tout faire : hash(…)

echo hash('md5', 'bonjour'); // f02368945726d5fc2a14eb576f7276c0
echo hash('sha1', 'bonjour'); // 1f71e0f4ac9b47cd93bf269e4017abaab9d3bd63
echo hash('sha512', 'bonjour'); // 3041edbcdd46190c0acc504ed195f8a90129efcab173a7b9ac4646b92d04cc80005acaa3554f4b1df839eacadc2491cb623bf3aa6f9eb44f6ea8ca005821d25d
echo hash('whirlpool', 'bonjour'); // e19423c475bde38dba1e985ab8126682473307e166b65719f11a2aac423214a1cbabb7f777b2a8d3c4611ceec33739c0bde2a062b5e39cd937e2cb03c8265e98

Heureusement, md5 et hash(‘md5’) le résultat est identique, comme pour sha1, car le système de cryptage sélectionné est le même.

Il y a encore bien plus de possibilité de hash : je vous laisse consulter le site.

Et pour pousser le vice assez loin : voici un petit exemple de ce qu’il est possible de faire pour crypter le mot ‘bonjour’.

$salt = "MARK-42"; // pour les fan d'Iron man :)

$content = strtolower("bonjour"); // transforme tout en minuscule
$sha256 = str_split($content); // transforme un string en tableau
$alphabetPsychopathe = array(
	'b' => "*42!", "n" => "hey"
);
$string = "";

for ($i=0; $i < count($sha256); $i++) {
	// on vérifie que la clé est bien dans notre tableau
	if(array_key_exists($sha256[$i], $alphabetPsychopathe)){
		// on remplace la lettre par notre alphabet
		$string .= $alphabetPsychopathe[$sha256[$i]];
	}else{
	// si la clé n'est pas dans le tableau, on conserve la valeur de base
		$string .= $sha256[$i];
	}
}
// ajout d'un underscore pour faire jolie :) et pour séparer
$mdp = $salt.'_'.$string.'_'.$salt; // MARK-42_*42!oheyjour_MARK-42

$crypter = hash('sha256', $mdp); // 936a100d05a909dde2278ef3d7e73e7abe7d0f724aedaf488ff55e5374b921ca

$nbCaract = strlen($crypter); // 64 caractères

$final = substr($crypter, 4, $nbCaract-10 ); // 100d05a909dde2278ef3d7e73e7abe7d0f724aedaf488ff55e5374

Pour la dernière ligne, je récupère uniquement la chaine qui va commencer à partir du caractère 4 et finir 54 caractères après.

Plusieurs points sont importants :

– on transforme en minuscule le mot que l’on veut crypter
– on change les lettres avec les éléments de notre tableau
– on ajoute notre salt (ou plusieurs ^^)
– on hash en sha256
– on récupère qu’une partie du hash

Cet exemple n’est pas infaillible ! Si un Hacker trouve votre fonctionnement … c’est foutu XD ! C’est comme n’importe quelle méthode de cryptage, si le processus est découvert … il tombe à l’eau.

Mots-clés associés à cet article :

Retrouvez d'autres articles par catégories