Bon comme je vous l'ai dit et redit et reredit il ne faut pas utiliser les scripts que vous avez réalisez pour les exercices précédant, pour la simple et bonne raison qu'il ne sont pas sur du points de vue de la sécurité.
Maintenant, nous allons voir comment augmentez la sécurité pour nos scripts PHP.
Si vous avez lu, voir même survoler mes exercices précédant vous avez certainement du voir le 'NEVER TRUST USER INPUT' ce qui veut dire en Français, 'Ne JAMAIS faire confiance au donnée de l'utilisateur'.
On va dire que la majorité des internautes ne sont pas capables de faire du mal à vos sites, mais il y en à quelqu'un (lamer et autre kevin) qui vont esseyer de piraté votre site chérie.
Il existe beaucoup de faille qui peuvent facilement combler, pour justement éviter l'attaque.
Mais il faut savoir aussi qu'un site web n'est jamais sur à 100%, Si un hacker veut accéder a votre site, il le pourra.
Avant d'aller plus loin je vous conseil de lire quelque article sur la sécurisation.
http://www.securite-info.org/
http://www.phpsecure.info/v2/article/XSS.php
http://fr.wikipedia.org/wiki/Cross-site_scripting
http://fr.wikipedia.org/wiki/Injection_SQL
C'est vers ces deux failles, XSS et injections SQL, que se TD sera orienté...
Je vous conseil pour le moment de lire uniquement ce qui concernent ces failles. Pour évitez de vous mettre la tête en choux-fleur.
Vous avez fait bonne lecture ? Vous êtes près à faire de la sécurisation ?!?
Vous êtes incollable sur la faille XSS ? Et les Injections SQL n'ont plus de secret pour vous ?
Faite chauffer vos clavier et en avant Guigamp...
Je vais d'abord jeter les bases de ce TD, nous allons prendre pour exemple le script que j'ai fais pour l'exercice 2.
Pour rappel le voilà :
Maintenant si vous avez bien lu et surtout bien compris les articles que vous avez lu, ce script à de GROSSES FAILLES de sécurité.
Il y a bien sur une faille XSS, et les INJECTIONS SQL sont possible.
Vous avez du voir que pour combler les failles XSS il fallait utiliser 'htmlspecialchars()' !?!
Il faut l'utiliser sur toutes les données que l'utilisateur nous envoie, comme _POST.
Oui je suis d'accord là dessus, mais on le mets où 'htmlspecialchars()' ?!?
DTC -> XD
Il faut appliquer cette fonction avant tout traitement. Donc ici dans ce script, il serai judicieux de le mettre avant la requète SQL.
Vous pouvez les mettre autres part si cela vous chantent, sauf bien sur après le traitement de l'information.
Alors ? c'était facile de combler la faille XSS ? Pour les injections SQL c'est aussi facile. Il suffit juste de rajouter la fonction 'mysql_real_escape_string()'
Ce qui donne un truc comme
Et voilà rien de plus simple. C'est içi que se TD s'arrète, j'espère qu'il vous aidera un peu, Et là je vais dire quelque chose de nouveau. Vous pouvez utiliser ça sur votre site.
Je vous invite à vous documentez plus en profondeur sur la sécurisation en PHP, il existe beaucoup de tuto sur le WEB, beaucoup sur le SdZ.
Maintenant, nous allons voir comment augmentez la sécurité pour nos scripts PHP.
Si vous avez lu, voir même survoler mes exercices précédant vous avez certainement du voir le 'NEVER TRUST USER INPUT' ce qui veut dire en Français, 'Ne JAMAIS faire confiance au donnée de l'utilisateur'.
On va dire que la majorité des internautes ne sont pas capables de faire du mal à vos sites, mais il y en à quelqu'un (lamer et autre kevin) qui vont esseyer de piraté votre site chérie.
Il existe beaucoup de faille qui peuvent facilement combler, pour justement éviter l'attaque.
Mais il faut savoir aussi qu'un site web n'est jamais sur à 100%, Si un hacker veut accéder a votre site, il le pourra.
Avant d'aller plus loin je vous conseil de lire quelque article sur la sécurisation.
http://www.securite-info.org/
http://www.phpsecure.info/v2/article/XSS.php
http://fr.wikipedia.org/wiki/Cross-site_scripting
http://fr.wikipedia.org/wiki/Injection_SQL
C'est vers ces deux failles, XSS et injections SQL, que se TD sera orienté...
Je vous conseil pour le moment de lire uniquement ce qui concernent ces failles. Pour évitez de vous mettre la tête en choux-fleur.
Vous avez fait bonne lecture ? Vous êtes près à faire de la sécurisation ?!?
Vous êtes incollable sur la faille XSS ? Et les Injections SQL n'ont plus de secret pour vous ?
Faite chauffer vos clavier et en avant Guigamp...
Je vais d'abord jeter les bases de ce TD, nous allons prendre pour exemple le script que j'ai fais pour l'exercice 2.
Pour rappel le voilà :
- Spoiler:
<?php
session_start(); // Démarrage des SESSION
$debug_co_aff = FALSE; // Si on veut faire un debugage du script // TRUE => AFFICHAGE ## FALSE => NON AFFICHER
if (isset($_GET['part']) && !empty($_GET['part'])) // Si l'utilisateur demende d'aller a PART
{
$debug_co = 'Acces n°1<br />';
if ($_GET['part'] == 'connexion') // Si l'utilisateur veut se connecter
{
$debug_co .= 'L\'utilisateur souhaite se connecter<br />';
if (!empty($_POST['login']) && !empty($_POST['password'])) // Si les champs LOGIN et PASSWORD ne sont pas vide
{
$debug_co .= 'L\'utilisateur à bien rempli le formulaire<br />';
SQL_connect ('localhost', 'root', ''); // Connection SQL
SQL_select_db ('groupephp'); // Selection de la BDD
$sql_user = SQL_select ('SELECT * FROM user WHERE login="'.$_POST['login'].'"'); // Requete SQL
SQL_close (); // Fermeture de SQL
if ($sql_user) // Si le retour de la requete est TRUE, sous-entendu qu'il n'est pas vide :-)
{
$debug_co .= 'Le compte existe dans la base de données.<br />';
if ($_POST['password'] == $sql_user['password']) // Si le PASSWORD de la BDD et le PASSWORD du FORM sont identique
{
$debug_co .= 'Connexion réussi.<br />';
$_SESSION['user']['connected'] = TRUE; // L'utilisateur est CONNECTE, il peut donc acceder au monde merveilleux de Alice
$_SESSION['user']['id'] = $sql_user['id']; // Passage de l'ID de l'utilisateur en SESSION
$_SESSION['user']['login'] = $sql_user['login']; // Pasage du LOGIN de l'utilisateur en SESSION
header ('Location: index.php'); // Redirection à l'index, pour ne pas avoir le ?part=connexion dans la barre d'adresse
}
else // Si le PASSWORD de la BDD et le PASSWORD du FORM ne sont pas identique
{
$debug_co .= 'Connexion échoué.<br />';
}
}
else // Si le retour de la requete est FALSE, donc pas de compte avec ce LOGIN
{
$debug_co .= 'Le compte n\'existe pas dans la base de données.<br />';
}
}
else // Si les champs LOGIN et PASSWORD sont vide
{
$debug_co .= 'Vous n\'avez pas remplit les champs.<br />';
}
}
elseif ($_GET['part'] == 'deconnexion')
{
session_destroy(); // Destruction de la SESSION
header ('Location: index.php'); // Redirection à l'index, pour ne pas avoir le ?part=deconnexion dans la barre d'adresse
}
}
echo ($debug_co_aff == TRUE) ? $debug_co : ''; // Condition ternaire, (CONDITION) ? SI VRAI : SI FAUX;
?>
Maintenant si vous avez bien lu et surtout bien compris les articles que vous avez lu, ce script à de GROSSES FAILLES de sécurité.
Il y a bien sur une faille XSS, et les INJECTIONS SQL sont possible.
Vous avez du voir que pour combler les failles XSS il fallait utiliser 'htmlspecialchars()' !?!
Il faut l'utiliser sur toutes les données que l'utilisateur nous envoie, comme _POST.
Oui je suis d'accord là dessus, mais on le mets où 'htmlspecialchars()' ?!?
DTC -> XD
Il faut appliquer cette fonction avant tout traitement. Donc ici dans ce script, il serai judicieux de le mettre avant la requète SQL.
Vous pouvez les mettre autres part si cela vous chantent, sauf bien sur après le traitement de l'information.
Alors ? c'était facile de combler la faille XSS ? Pour les injections SQL c'est aussi facile. Il suffit juste de rajouter la fonction 'mysql_real_escape_string()'
Ce qui donne un truc comme
- Code:
$login = mysql_real_escape_string(htmlspecialchars($_POST['login']));
Et voilà rien de plus simple. C'est içi que se TD s'arrète, j'espère qu'il vous aidera un peu, Et là je vais dire quelque chose de nouveau. Vous pouvez utiliser ça sur votre site.
Je vous invite à vous documentez plus en profondeur sur la sécurisation en PHP, il existe beaucoup de tuto sur le WEB, beaucoup sur le SdZ.