Sécurisation d'un site web

Fermé
sarahcorneille Messages postés 36 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 16 mars 2014 - 15 févr. 2014 à 18:08
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 10 mars 2014 à 11:29
Bonsoir,

J'aimerais en savoir plus sur la sécurisation d'un site web dynamique avec accès à une base de données. Je sais qu'il faut vérifier s'il n'y a pas d'injections sql grâce à la fonction php mysql_real_escape_string() mais je ne sais pas si c'est suffisant.

Pour l'accès à la partie administration du site web, je sais qu'il faut vérifier si le nom de l'utilisateur et le mot de passe sont corrects. Si un des deux est incorrect, on affiche un message "votre nom d'utilisateur ou votre mot de passe est incorrect" pour éviter qu'un hacker sache lequel est bon quand il essaie de pirater un site. Après quand c'est bon je crois qu'on crée des variables de sessions et qu'on fait une redirection vers la partie administration.

J'ai vu une fois un reportage, sur une entreprise qui engagent des hackers éthiques qui montraient comment il est facile de pirater un système, de récupérer des données d'un gsm, ... D'ailleurs, lors du reportage, il y avait un ex-ministre qui disait que certains mails qu'il possédait étaient confidentiels et qu'il n'aurait pas voulu que n'importe qui y ait accès. Il y avait aussi une démonstration d'un hacker du groupe an... qui montrait comment il était facile de pirater un compte face... J'ai entendu que des bases de données pourtant d'entreprises importantes avaient été piratées. Donc, la sécurisation est importante. Je connais quelqu'un qui fait un bac en info et la personne me disait qu'un de ses professeurs avait dit que les meilleurs en sécurisation étaient les pires hackers. D'ailleurs, on m'a dit que des grosses entreprises cherchaient des hackers qui sont doués afin de sécuriser leur réseau info, ... Il paraît qu'il y a même des concours de piratage avec un recrutement à la clé.

Au final, j'aimerais en apprendre le plus possible sur ce domaine, pas pour pirater mais pour savoir comment protéger contre le piratage.

MERCI
A voir également:

8 réponses

Salut, je te conseil d'utiliser PDO car tu peux faire des requête préparées ce qui limite beaucoup les risques d'injections.

Moi personnellement (je sais pas si je fais bien :/) pour les requetes en plus de les préparées j'échappe des simple et double quotes. Si c'est des informations qui doivent s'afficher sur le site j'utilise htmlspecialchars ou htmlentities pour remplacé les caractères spéciaux par des entités.

J'évite la méthode get et privilégie les sessions + les cookies avec une courte durée de vie. Si j'utilise la methode GET en général j'utilise url rewriting.

bien sur les mots de passes doivent passer entre les "mains" d'un algorithme de cryptage minimum sha1. Même pour la base de donnée.

il faut éviter de mettre des droits 777 à tout va et bien réfleichir pour offrir des droits minimum mais sufifsant.

pour les parties administration du site, l'utilisation d'un .htaccess est bien.

tu peux pour 20 euros chez gandi mettre en place un certificat ssl

Je vais pas faire un cours complet car c'est trop long et je suis pas sur d'avoir les compétences pour....

si tu veux tester tes sites il existe sous Linux beaucoup de tools pour faire cela. Il y en a un que j'aime bien qui est multiplate-forme c'est w3af

http://w3af.org/

bonne soirée

(¯'·.¸¸.·'¯'·.¸¸.-> <-.¸¸.·'¯'·.¸¸.·'¯)
0
Utilisateur anonyme
16 févr. 2014 à 00:01
sinon tu peux te référer :

https://owasp.org/www-project-cheat-sheets/cheatsheets/PHP_Configuration_Cheat_Sheet.html

http://www.cert.ssi.gouv.fr/site/CERTA-2004-INF-001/index.html

https://www.ssi.gouv.fr/administration/bonnes-pratiques/

https://www.ssi.gouv.fr/uploads/IMG/pdf/NP_Securite_Web_NoteTech.pdf

0
sarahcorneille Messages postés 36 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 16 mars 2014
17 févr. 2014 à 00:07
Bonsoir lobotoFix,

Je te remercie pour tes infos. J'essaierais d'analyser tout ça le plus rapidement possible mais ce n'est pas toujours évident car ça prend du temps.

Je n'ai pas encore approfondi les requêtes préparées. Que veux-tu dire par "j'échappe des simple et double quotes"? Je sais que ce qui a entre simple ' n'est pas interprété tandis qu'entre double " bien enfin si je ne me trompe pas.

Je ne connais ni htmlspecialchars ni htmlentities et je ne comprends pas ce que tu veux dire par "remplacer les caractères spéciaux par des entités".

Oui, la méthode get avec l'url ce n'est pas top mais parfois t'en a besoin quand tu dois savoir si c'est un ajout, une modification ou une suppression pour le routage.

Je n'ai pas vu comment on gérait les cookies.

Comment réécris-tu l'url?

Pour les mots de passe, je n'ai pas encore étudié la question mais je sais qu'un cryptage md5 est trop beaucoup trop faible. J'ai entendu parler de grain de sel mais il faut que je me renseigne.

Qu'est-ce que tu entends par les droits 777?

Je ne crois pas que je verrais l'utilisation d'un .htaccess cette année, il me semble que c'est plus en objet quoi que souvent les formations sont courtes pour voir chaque point important. La sécurisation passe au second plan, c'est dommage.

Quand tu dis 20 euros c'est par mois? Tu peux m'en dire plus sur le certificat ssl.

Je ne connais pas du tout linux.

MERCI
0
Utilisateur anonyme
17 févr. 2014 à 01:10
Salut je vais essayer d'être plus clair :)

Si tu utilise php en procédurale il te faut te protéger obligatoirement. En effet, si tu fais un requête de ce genre.

$sql="select * from ma_table where login='$login' and password='$pass'"


Si tu met le bon login et mot de passe tu revoie un booléen avec la valeur true.

Si la personne mal attentionné met dans les champs du formulaire " OR 'x' ='x' tu va modifier le requetes en :

$sql="select * from ma_table where login='' OR 'x'='x' and password='' OR 'x'='x'";


et donc la requete va être validé car x est bien égale a x.

ensuite le cour de openclassroom est intéressant car il apprends à faire des requêtes préparée.

https://openclassrooms.com/fr/courses/918836-concevez-votre-site-web-avec-php-et-mysql

en reprenant ce tuto est la même requete que je t'ai montrer plus haut tu peu la faire de cette manière.

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=pourCcm', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$login = addslashes($_POST['login']);
$password = sha1($_POST['password']);

  $sql =" SELECT * FROM ma_table WHERE login = :login AND password= :password";
$tab = array("login" => $login , "password" => $password);
$req = $bdd ->prepare ($sql); //on prépare la requete
$req -> execute ($tab);
$req-> closeCursor();

?>


en fait si tu regarde cette ligne :
$login = addslashes($_POST['login']); on ajoute un anti slach (\) devant les ' et " pour que si le type met " OR 'x' ='x' on se retrouve avec \" OR \'x\' =\'x\'. De toute manière avec la requete préparée je pense que les risques sont limités mais je fais comme cela tout de même.

si tu prends la ligne :

$password = sha1($_POST['password']); cela permet de crypter le mot de passe. En effet md5 est plus très sur et sha1 est mieux. Mais tout de même les choses évolue et il est moin sur aussi. sha256 a été integrer a php je le sais mais je m'en suis encore jamais servi. Il y a d'autre algo qui sont intéressant aussi.

Ensuite tu peux aussi activer les backslach pour les quotes depuis le serveur...c'est même recommandé :) en modifiant le fichier /etc/php5/apache2/php.ini
et en mettant magic_quotes_gpc = On

il y a beaucoup d'autre protection à mettre en place au niveau du serveur, mais souvent on utilise un mutualisé et ion a pas s'occuper de tout ca.

htmlspecialchars(): remplace dans la chaîne fournie en argument, les caractères "<" par <, etc.
htmlentities(): fait le même travail mais l'applique également sur les caractères accentués.

en fait les entité vont te permettre de faire aparaitre du code sans modifier ta page.

Si tu fais un livre d'or ou les gens peuvent mettre des chose comme "merci votre site est génial" par exemple. pas de souci dans ce cas là.

mais si on met au lieux de "merci votre site est génial " un truc comme <script>alert('coucou');</script> tu va te retrouver avec un pop up coucou a chaque fois que quelqu'un visite la page. cet exemple est gentil mais c'est pour comprendre. Avec les entité https://alexandre.alapetite.fr/doc-alex/alx_special.html les caractère spéciaux seront modifiés et le texte pourra apparaitre sans modifier le code source.


Oui, la méthode get avec l'url ce n'est pas top mais parfois t'en a besoin quand tu dois savoir si c'est un ajout, une modification ou une suppression pour le routage.
tu as meilleur temps d'utiliser des variables de sessions quitte à les détruire une fois fini
http://fr.openclassrooms.com/informatique/cours/concevez-votre-site-web-avec-php-et-mysql/les-sessions-2

oui c'est mieux les sessions car certains logiciel q'utilise les pirates ne fonctionne que sur les variable passée en url...si il y a pas de variable dans l'url sa fonctionne pas. c'est pour cela que le réécriture d'url est intéressante.

le mieux est de la faire depuis le .htaccess.

https://craym.eu/tutoriels/referencement/url_rewriting.html. // je sais pas ce que vaut se tuto, j'ai pris le permier

Concernant les doits 777 (droit maximum) c'est à eviter. si tu utlise un serveur dédié faudra faire très attention à cela. pour un mutualisé c'est au niveau de filezilla (ftp) que tu devra regler les droits. C'est trop long à expliquer, j'ai pas le courage mais tout est ici : http://fr.openclassrooms.com/informatique/cours/reprenez-le-controle-a-l-aide-de-linux/chmod-modifier-les-droits-d-acces-1

En fait un certificat ssl sa va te permettre de chiffrer ta connection (https le petit cadenas :)). Si tu fais un site marchands c'est indispensable pour la sécurité des internaute et maintenant les gens sont méfiant et ils ont raisons il évite les transactions si il y a pas le petit cadenas. Mais je pense que pour otut type de site c'est important.

https://v4.gandi.net/static/press/Gandi_un_domaine_un_certificat.pdf

voila celui là il est pas cher car il y a pas l'assurance avec mais au moins ta connexion est sécurisé.

désolé pour les fautes d'othographe :) et bonne fin de soirée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sarahcorneille Messages postés 36 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 16 mars 2014
6 mars 2014 à 02:06
Bonsoir lobotoFix,

Tout d'abord, je m'excuse pour ma réponse tardive mais ce n'est pas toujours évident de tout gérer et je te remercie beaucoup pour toutes tes infos. Néanmoins, si je dois lire et analyser tout ça, dans un an mon site n'est pas encore en ligne xd!

J'ai discuté avec une personne qui est en deuxième. Tout ce dont tu parles, ils l'ont pas vu au cours l'année passée. Il y a sûrement beaucoup de recherche perso à faire. Je le sens mal ça me débrouiller toute seule, il faudra un miracle.

Cette année, en deuxième, ils font du php objet (d'abord un mvc à la main et puis une utilisation d'un framework). Par contre, cette personne m'a parlé de la vérification par les fonctions: int() pour un id et mysql_real_escape_string() pour une chaîne de caractères qui éviteraient les injections courantes.

Est-ce suffisant pour un site normal?

Quand je dis normal, c'est juste un site informatif, il n'y a pas de données confidentielles. Ce n'est pas un magasin en ligne, ... Par contre, j'ai quand même quelques autres questions (oui suis chiante xd).

Comment protéger son adresse courriel d'administrateur contre les robots qui récupère les adresses courriels en vue d'envoyer des spams (publicités, ...)? Je veux bien la manière simple et la manière compliquée.

Est-ce exact que s'il n'y a qu'une partie publique sans formulaire d'ajout dans la base de données, l'hébergeur assure la protection de la base de données?

Si c'est le cas, je n'aurais qu'à faire une vérification avec des int() pour le renvoi, le changement de la requête SQL et l'affichage vers une page donnée (par exemple, suite à un clic sur un lien (id du lien)).

Quand j'entends les sites qu'on arrive à pirater où y a une équipe de vrais pros derrière, ça fait un peu peur de travailler seule sur un site avec des formulaires, de la gestion de membres, de la gestion d'administrateurs, ...

Pour les infos de la base de données, vaut-il mieux toujours travailler en local pour avoir une sauvegarde des données puis faire la mise à jour vers le site hébergé?

Faut-il penser à la base de données dans tout son ensemble ou est-ce possible d'ajouter des tables facilement sans perdre des données?

Quand je te lis, j'ai l'impression de pas apprendre grand chose à ma formation xd.

MERCI
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
6 mars 2014 à 14:19
Salut,

Petites remarques concernant les injections sql et xss.

Pour insérer des données non sure en bdd, il faut utiliser :
- mysql_real_escape_string() si tu utilises l'API MySQL (obsolète)
- mysqli_real_escape_string() si tu utilises l'API MySQLi
- les requêtes préparées ou quote() si tu utilises PDO

Aucune raison d'utiliser addslashes() ou htmlentities() pour l'insertion en bdd.

Pour afficher des données non sure dans la page html, il faut utiliser la fonction htmlentities() ou htmlspecialchars() avec le bon encodage.

Enfin, les paramètres GET ou POST n'ont rien de dangereux du moment que l'on contrôle bien ce qui est attendu comme valeur : utiliser par exemple les regex ou la fonction filter_var().

Bonne journée
0
sarahcorneille Messages postés 36 Date d'inscription samedi 15 février 2014 Statut Membre Dernière intervention 16 mars 2014
7 mars 2014 à 01:15
Bonsoir Pitet,

Je te remercie pour tes infos. J'ai quelques questions suite à ces infos.

Pourrais-tu me préciser comment je sais si je dois utiliser mysql_real_escape_string() ou mysqli_real_escape_string()?

Quand tu dis que l'api mysql est obsolète, cela veut-il dire que c'est plus "dangereux" d'utiliser mysql_real_escape_string() que mysqli_real_escape_string()?

Quand tu dis il faut utiliser la fonction htmlentities() ou htmlspecialchars() avec le bon encodage, qu'est-ce que cela signifie? Faut-il passer des paramètres différents à la fonction?

Comment définit-on à la fonction filter_var() que l'on attend un int, un float, un varchar, un text, ...?

MERCI

Bonsoir à tout le monde,

Je m'excuse pour toutes mes questions mais la sécurisation est tellement importante de nos jours, que j'essaie d'en apprendre le plus possible sur ce forum car je sais qu'au cours, nous ne verrons pas grand chose sur cette partie car la formation apprend les bases (liste détails, administration avec le routage pour l'ajout, la modification, la suppression et l'affichage, ...). Par contre, on ne verra pas grand chose au niveau de la sécurisation, du cryptage des mots de passe, ...

MERCI
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
10 mars 2014 à 11:29
Je te renvoie sur plusieurs liens de la doc php qui apporte plusieurs éléments de réponses. N'hésite pas si tu veux des détails sur un point précis :

Tu dois utiliser la fonction d'échappement de caractère sql en fonction de l'API MySQL utilisé :
https://www.php.net/manual/fr/mysqlinfo.api.choosing.php

Une fonction qui est obsolète n'est plus mis à jour et sera supprimée dans les futures version de php. Ce n'est pas plus dangereux de l'utiliser, mais tu ne bénéficies pas des avantages des nouvelles fonctions et donc code devra être modifié pour les prochaines versions de php.

Pour htmlentities(), tu peux effectivement définir l'encodage avec le 3e paramètres si celui par défaut ne correspond pas au bon encodage (UTF-8 depuis php 5.4).
https://www.php.net/fr/htmlentities

Comment utiliser filter_var() : https://www.php.net/manual/fr/function.filter-var.php
Les types de filtres disponibles : https://www.php.net/manual/fr/filter.filters.php

Concernant la sécurisation des mots de passe : https://www.php.net/manual/fr/faq.passwords.php
avec la nouvelle api de php 5.5 : https://www.php.net/manual/fr/book.password.php

Bonne journée
0