supinfo
Ouverture de  SUPINFO USA à San Francisco en 2008. Des études en informatique en Californie à un tarif abordable ! Inscrivez-vous dès maintenant !
supinfo
Connexion :

Recherche

  
   Tout| Actus| Télécharger| Comparateur de prix| Dossiers| Forums| Jeux| Google

30 messages
ok

Mettre en place un accès sécurisé ? - PHP/MySql + login et pass

Bonjour,

je souhaiterai mettre en place un accès sécurisé (login + password) à des pages html, en utilisant PHP et MySql.

Est ce compliqué à mettre en place ?
Comment cela fonctionne t il ?
La sécuritée est elle garantie à 100% ?

Merci de m'éclairer :jap:
 
 
tanktrasher a écrit:
Est ce compliqué à mettre en place ?

non ('fin de mon point de vue après plusieurs années d'expériences, non ... tout dépend de ta compréhension de PHP, notemmant des parties concernant les sessions)

tanktrasher a écrit:
Comment cela fonctionne t il ?

grosso-merdo :
1/ récupération des données du formulaire login / pass
2/ vérification dans la base de donnée si login / pass existe
3/ si ok, création d'une session sur le serveur
4/ tant que la session existe et comprend des données cohérentes (à toi de définir quoi), l'utilisateur est considéré comme connecté
5/ l'utilisateur clique sur le bouton déconnexion, ou un paramêtre de ta session n'est pas valide > session détruite

tanktrasher a écrit:
La sécuritée est elle garantie à 100% ?

jamais à 100% ... même avec du SSL, rien ne prouves que le gars qui tapent le login / pass est bien celui censé l'utiliser ...
après, une session peut-être "assez facilement" détourner durant son utilisation ... par exemple, les sessions dont les identifiants se baladent dans l'URL ... combien de fois un pote m'as envoyer une adresse forum.truc/post.php?phpsessid=0ezrsdf101sdf2sd1f0 et bam, j'étais loggué avec son compte, je pouvais poster et tout :paf: ...
pour contrer ça, tu peux mettre en place des mécanismes assez simples de vérification de session (par exemple stocker l'adresse IP de la personne qui a ouvert la session dans la session, et ensuite vérifier sur chaque page que l'ip qui utilise la session est bien la même ... etc ...)
mais tu ne pourras jamais garantir que la personne associé à un login / pass est bien la personne derrière le clavier :neutre: ...

maintenant, tout dépend du niveau de sécurité que tu veux sur ton site :fou:
 
 
Merci beaucoup !

va falloir que j'etudie ça ...
en gros voila ma situation :

j'ai 2 3 pages Html sur le net ou j'ai stocké des photos, et je souhaiterai mettre en place un accès sécurisé pour y accéder ... Pour le moment on y accède directement par l'URL ...
 
 
si tu n'as pas besoin de quelque chose de "dynamique" (inscription d'utilisateurs automatiques etc ...), tu peux gêrer ça avec les .htaccess d'apache (à supposer que tu sois sous apache évidemment :paf: ) ...
 
 
qqch de simple sera alors suffisant, les données ne sont pas critiques :)

Je suis pas un pro comme kiss, j'ai pris un script que j'ai adapté, et j'ai capté comment il marchait en plus (omg !!). Voilà la page de connexion :

Code :
<?php
// si le nom d'utilisateur est défini, ou le mot de passe également
if ( isset ($_POST['name']) || isset ($_POST['pass']) )
{
// formulaire recu

// On vérifie que user n'est pas vide...
if (empty($_POST['name']))
{
die ("ERREUR: Entrez un nom d'utilisateur!");
}
// on vérifie que le pass n'est pas vide !!
if (empty($_POST['pass']))
{
die ("ERREUR: Veuillez entrer un mot de passe!");
}

// On fait notre requête vers la table utilisateurs :)
$query = "SELECT `id_user`, `nom_user` FROM `users` WHERE `nom_user` = '".$_POST['name']."' AND `password_user` = '" . $_POST['pass']."' ";

// Execute la requete
$result = mysql_query($query) or die ("Error in query: $query. " . mysql_error());
$data = (mysql_fetch_array($result) );
// Regarde les valeurs retournees par la base
if (mysql_num_rows($result) == 1)
{
// si une ligne est retournee,
// l'authentification est bonne
// crée le cookie avec le nom d'utilisateur et la session
session_start();
$_SESSION['id_user'] = $data['id_user']; // cette ligne crée une variable de session, où l'on sauve l'id de notre utilisateur connecté
$_SESSION['nom_user'] = $data['nom_user']; // pareil pour son pseudo :)
setcookie("username", $_POST['name'], time()+(84600*30)); // même principe mais avec un cookie, on sauve le nom de la personne (tu vas comprendre pourquoi ensuite)

// ensuite on affiche un texte en html pour dire que tout fonctionne, c'est ma méthode crade avec une redirection html, mais bon :/
?>
<h2>Acces autorisé !</h2><h4>Vous allez être redirigé dans 2 secondes</h4><meta http-equiv=refresh content="0; url=blabla.php">
<?php
}
else
{
// sinon et bien qqch a mal fonctionné ! authentification impossible
echo "ERREUR: Login ou Mot de passe incorrect!";
}

// Libere le resultat
mysql_free_result($result);
}
else
{
// pas d'envoi
// affiche le formulaire
?>
<html>
<head>
<title>WoW Orga - Evolution</title>
<link rel="stylesheet" type="text/css" media="all" href="style.css" />
</head>
<body>
<center>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"><p>Username <input type="text" name="name" value="<?php echo $_COOKIE['username']; ?>"></p>
<?php
// ICI le cookie qu'on a créé tout à l'heure prend son utilité : si la personne s'est déjà connectée une fois et qu'elle revient, alors son pseudo sera pré rempli, c'est pratique !!
?>
<p>Password <input type="password" name="pass">/p>
<input type="submit" name="submit" value="Log In">
</center>
</body>
</html>
<?php
}
?>


Ca c'est pour la partie connexion ;) après faut vérifier sur chaque page que le mec est connecté : <?php include('secure-check.php') ?>

Code :
<?php 

// on lance la session
session_start();
/// vérification qu'il n'existe PAS une variable de session id_user (créée uniquement si on se connecte avec succès)
if ( !isset($_SESSION['id_user']) ) { 
die ("ERREUR: Acces interdit!"); 
} 
// Sinon et bien c'est que la variable existe, donc on ne fait rien de spécial et le script continue sa route (et affiche ta page).
else { 
} 

?> 
 
 
:jap: :jap: :jap:

Merci beaucoup pour ces précisions !!!

je vais tester ça et je vous tiens au courrant ...

merci encore :jap:

Pour ceux que ça interesse, voici une page d'explication sur le fonctionnement des Sessions sous PHP :
http://wiki.media-box.net/tutoriaux/php/ut...es-sessions-php
très bien conçu je trouve ... :)
 
 
ça marche impeccable .. mais (car il ya toutjours un mais) lorsqu'au cookie n'a été crée dans le login j'ai les lignes suivant
Code :
<br /><b>Notice</b>:  Undefined index:  username in <b>c:\program files\easyphp1-7\www\secure\connexion.php</b> on line <b>63</b><br />


Qu'est ce que c'est ???
merci de m'eclairer :jap:
 
 
Tu regarde ligne 63, et tu observe ...

(il s'agit d'une variable non défini, c'est un peu comme de lire un fichier qui n'existe pas, etc)
 
 
je ne ferais pas de pub, mais si tu as acces a la config du serveur il y a des bons tutos online [:siffle]

(cf ma signature :ane:)
 
 
je vois bien ou se situe le probleme (le cookie "usrname" n'est pas encore créé), mais je ne vois pas commetn faire pour réosudre se probleme :( ...

Sinon l'utilité du cookie est elle necessairement obligatoire pour enregistrer Login + pass ??
etant donné qu'il est possible d'enregistrer ces indications dans les navigateur (Mozilla, inetrnet explorer ...) :neutre: ...

En fonctionnat sans la création d'un cookie ça marche bien :)
 
 
Sans cookie, ou sans variable get de session, tu ne peux pas faire de session qui dure. Donc moralité, le cookie est tout conseillé.

sinon http://www.php.net/isset
 
 
Dans le cas qui nous intéresse : le cookie sert simplement à afficher le nom de la personne quand elle reviendra ;)

J'ignore pourquoi ca ne fonctionne pas chez toi, mais vérifies que les noms de variables sont constants, ainsi que la requête SQL :)
 
 
Il n'est pas très util ce cookies, tu peux t'en priver surtout s'il cause des problèmes. D'ailleurs je vois pas réellement à quoi il sert, enfin je vosi son utilisation, mais comme il a déjà était dit la plupart des explorers concervent ce genre de données, et puis les sessions ne sont jamais illimitées (à moins que l'on m'ai menti :| ), c'est juste un petit confort d'utilisation au cas où...
 
 
[mode=boulet]
Doit être marrant ce script sans les magic_quotes. :neutre:
[/mode]

[mode=moins-boulet]

pour supprimer (au moins partiellement) la faille, mettre en début de code
if (!get_magic_quotes_gpc()) exit('Magic_quotes desactivés !');
ou alors transformer un peu les variables utilisateurs avec un truc style mysql_real_escape_string() (merci Sans-Pseudo :p)
[/mode]
 
 
Oui c'est un tutorial chopé sur le net et adapté, il a pas spécialement pour vocation d'être "sécurisé" pour empêcher les mecs doués ^^
 
 
Startide a écrit:
l a pas spécialement pour vocation d'être "sécurisé" pour empêcher les mecs doués ^^
Oui mais rien que sans magic_quotes, si tu mets un simple quote ' dans la requète soit :
- elle plante
- tu fais une injection (volontairement ou pas)
 
 
SandRock Mp4 a écrit:
Oui mais rien que sans magic_quotes, si tu mets un simple quote ' dans la requète soit :
- elle plante
- tu fais une injection (volontairement ou pas)

+1
Sa ma toujours fait triper de me logger en mettant comme psswd "OR 1=1" :ane:
 
 
Metaldark a écrit:
+1
Sa ma toujours fait triper de me logger en mettant comme psswd "OR 1=1" :ane:


mdrrr j'y avais jamais pensé ^^
 
 
Après pour la sécu, il y a d'autres choses à faire comme :
- demander à l'utilisateur d'écrire le contenu d'une image générée lorsqu'il ratte son mot de passe plus de 3 fois (pour éviter les attaques brute-force)
- vérifier le référent, c'est contournable mais c'est déjà ça de plus...
- limiter les login et pass à certains caractères (avec une belle regex) avec par exemple au maximum un seul quote ' : if (preg_match('!^[a-z0-9 _-]+\'?[a-z0-9 _-]+$!', $pseudo_ou_pass))
 
 
+1 pour l'image.... Alala ces attaques DoS :MDR

Un exemple vite fait :

Le fichier img.php qui génére une image aléatoire
Code :
<?php
$code=rand(10000,99999);
session_start();
$_SESSION['code'] = $code; // On stoke le code dans une session

// Définition des dimensions
$img = imagecreate(72, 25);
// Défintion des couleurs
$bgc = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
$gris = imagecolorallocate($img, 128, 128, 128);
// Remplissage du fond
imagefilledrectangle($img, 0, 0, 72, 25, $bgc);
// Ecriture du code (le premier 5 est la taille - de la police par défaut - la plus grande dans GD)
imagestring($img, 5, 12, 5, $code, $black);
// Ajout d'un bruit
for($i=0;$i<150;$i++) {
imagesetpixel($img, rand(0,72), rand(0,25), $gris);
}
// Création de l'image (qualité 15% : très médiocre)
header("Content-type: image/jpeg");
imagejpeg($img, '', 15);
imagedestroy($img);
?>


Le fichier form.xhtml
Code :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<img src="img.php" width="72" height="25" />
<form action="send.php" method='post'>
<input type="text" name="code" maxlength="8" />
<input type="submit" value="test" />
</form>
</body>
</html>


Le fichier send.php qui traite le formulaire (à compléter :D )
Code :
<?php
session_start();
if ($_POST[code]!=$_SESSION['code']) { exit; }
// et le reste...
?>



PS: http://phpdebutant.org/article47.php ;)
 
 
 
30 messages
ok
 
Vous devez être connecté pour écrire un message !
 

 Sujets Similaires:


 
Clubic.com
 
Achetez-facile.com
 
Jeuxvideo.fr
 
neteco.com
 
mobinaute.com