Mysql
 sql >> Base de données >  >> RDS >> Mysql

Formulaire de connexion PHP avec formulaire HTML

Juste pour le plaisir de la tête (pour que vous ayez une idée de la raison pour laquelle Fred -ii- a dit de ne pas utiliser ce code) - je vais un peu démonter cela, dans l'ordre, au fur et à mesure que je le parcoure (ce n'est pas une fouille personnelle de la personne qui pose la question - mais juste pour donner une idée du fait qu'essayer de créer une application semi-sécurisée sur la pile LAMP nécessite un peu de soin et de prévoyance ... et un cynisme sanglant associé à l'hypothèse du pire dans l'humanité aide):

Point 1

Ce n'est pas grave - mais vraiment si vous allez démarrer une session, vous devriez démarrer une session indépendamment du fait qu'il y ait $_POST données ou non. Vous devriez probablement avoir besoin de votre fichier de configuration et démarrer la session en haut avant toute autre chose.

Pas une erreur terminale (car vous n'avez pas de validation de session) - juste bizarre.

Point 2

Vous avez une sortie dans ce fichier (echo ) il doit donc se trouver sous la racine du document et disponible dans l'arborescence Web.

include("config.php");

Ce n'est pas vraiment écrit correctement, cela devrait probablement être require_once 'config.php'; (en supposant qu'il s'agit d'un fichier de programme requis et non d'une inclusion facultative qui peut être autorisée à échouer) mais c'est pas l'erreur. L'erreur est que vous avez votre fichier de configuration à l'intérieur de la racine de votre document. Une mauvaise configuration du serveur ou une simple faute de frappe dans ce fichier pourrait, théoriquement, permettre au contenu de ce fichier d'être affiché à l'écran en texte brut, révélant potentiellement les chaînes de connexion de votre base de données (et qui sait quoi d'autre) à world + dog.

Les fichiers de configuration doivent exister en dehors de l'arborescence Web ou, à défaut, dans un répertoire protégé par quelque chose comme .htaccess Deny from all . Ils ne doivent jamais être accessibles via HTTP.

Point 3

Le mysql la bibliothèque est obsolète et ne doit pas être utilisée du tout ; MySQLi ou PDO sont la voie à suivre, idéalement avec des paramètres/valeurs liés :

http://uk3.php.net/PDO

http://uk3.php.net/mysqli

Personnellement j'en aurais eu pour AOP.

Points 4 et 5

$password = mysql_real_escape_string(stripslashes(md5($_POST['password'])));

Tout d'abord, l'ordre de ceci est faux. Vous hachez $_POST['password'] et puis essayer de supprimer les barres obliques - il n'y aura pas de barres obliques une fois qu'il aura été haché. Cependant, si vous essayez d'empêcher les gens d'utiliser des barres obliques (ou autre) dans les mots de passe, vous devrez les supprimer avant de hacher la chaîne.

Suivant md5 ne doit pas être utilisé comme algorithme de hachage de mot de passe, il s'est avéré faible et peut être forcé brutalement à créer des collisions de chaînes beaucoup plus fréquemment qu'il ne le devrait.

Oui, vous devriez stocker uniquement les hachages ou "empreintes digitales" des mots de passe plutôt que les mots de passe eux-mêmes mais, idéalement, vous voulez saler et hacher (avec au moins sha1 ) ces mots de passe plutôt que de simplement les jeter dans un md5() fonction.

Voir :http://uk3.php.net/mcrypt par exemple

Et faites une recherche sur "password salting hashing" en utilisant le moteur de recherche de votre choix.

Point 6

SELECT id FROM $table 
WHERE username = '" . $username . "' 
and password = '" . $password . "';

J'ai ajouté dans le = qui manquait dans la question d'origine, mais toujours, ne correspondent pas au nom d'utilisateur et au mot de passe dans votre requête ... si quelqu'un réussissait à obtenir une injection SQL dans votre nom d'utilisateur, le mot de passe ne serait jamais vérifié. Imaginez :

SELECT user.id 
FROM user WHERE user.username = 'fred' OR 1 = 1 
-- AND user.password = 'abc123'

Il est préférable de sélectionner l'identifiant de l'utilisateur et l'empreinte digitale du mot de passe dans la base de données, puis d'évaluer le mot de passe dans l'application plutôt que de faire confiance à une vérification du mot de passe dans la couche de base de données. Cela signifie également que vous pouvez utiliser un algorithme de hachage et de salage dédié dans l'application elle-même pour valider vos mots de passe.

Point 7

$_SESSION['user'] = $_POST["username"];

Il s'agit simplement de stocker le nom d'utilisateur dans la session ? Cela ne doit en aucun cas être utilisé comme un "vérificateur de connexion", d'autant plus qu'il n'y a (apparemment) rien dans votre session pour empêcher piratage .

L'identifiant de session pourrait facilement être reniflé à partir du cookie d'une session en direct et c'est tout ce qui serait nécessaire pour "emprunter" la connexion de quelqu'un d'autre. Vous devriez au moins essayer d'atténuer le risque que la session soit piratée en associant l'adresse IP de l'utilisateur, la chaîne UserAgent ou une autre combinaison de données relativement statiques que vous pouvez comparer sur chaque page... il y a cependant des inconvénients à pratiquement n'importe quelle approche (en particulier, comme je l'ai découvert, si vous avez des visiteurs utilisant AOL) - mais vous pouvez créer une empreinte de session efficace à plus de 99 % pour atténuer le piratage avec très peu de chances que la session de l'utilisateur soit vidé par erreur.

Idéalement, vous pouvez également créer un jeton pour la session afin d'atténuer CSRF attaque lorsque l'utilisateur a besoin d'effectuer une action "privilégiée" sur la base de données (mettre à jour ses coordonnées ou autre). Le jeton peut être un code totalement aléatoire et unique stocké dans la base de données et/ou dans un cookie SSL lorsque l'utilisateur se connecte (en supposant que l'utilisateur ne peut effectuer aucune action mettant à jour la base de données en dehors de HTTPS car cela ne ferait que transmettre les données en texte clair sur Internet - ce qui serait une mauvaise idée ).

Le jeton est placé dans un champ de formulaire masqué pour tous les formulaires et vérifié par rapport à la valeur stockée dans le cookie (ou la session ou la base de données) chaque fois que ce formulaire est soumis. Cela garantit que la personne soumettant le formulaire a au moins une session en direct sur votre site Web.