Page 1 sur 1

Vos commentaires sur ce code

Posté : 17 févr. 2010, 15:09
par Cerbere1980
Bonne rencontre,

Je débute en PHP et je désire faire les choses dans les règles de l'art. On progesse dans un langage en regardant la documentation, les sources des autres et en ossant exposer son propre code pour qu'il soit critiquer.

J'attends donc un retour de votre part me disant tu aurais du faire comme ça ou il faut surtout pas faire ça. L'objectif ici est une page de login qui je l'espère est protégé par des attaques de type injection.

J'utilise une connexion en PDO.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="description" content="Page de Login." />
<link href="style/stylesauth.css" media="all" rel="stylesheet" type="text/css" />
<title>Login</title>
</head>
<body>
<div id="authentification">
<?php

$check=false;

	if(!empty($_POST['envoyer']))
		
		{
			
			// Evalué à faux si $_POST['login'] est vide
			if (!empty($_POST['login'])) {

  					// Evalué à faux si $_POST['password'] est vide
					if (!empty($_POST['password'])) {
						
						$login= $_POST['login'];
						$password = $_POST['password'];
						
						//Traitement contre injection					
						$login= str_replace("'"," ",$login);
						$password= str_replace("'"," ",$password);
						
						//On ouvre la connexion
						include_once('connexion/connect.inc.php');
						$conn = ouvreConnexion();

						try{ 
							$stmt = $conn->prepare('SELECT Sel,Password FROM Agence WHERE Mail= :login');
							$stmt->execute(array(':login'=> $login));
	 					  }
    					catch(PDOException $e){
            			 print "Erreur !: " . $e->getMessage() . "<br/>";
            			 die();
      					 } 
      					 
      					 while($row = $stmt->fetch(PDO::FETCH_BOTH)){
       							 $sal = $row[0];
       							 $passwordDb = $row[1];
      					 }
      					 
      					 print $sal . "\t";
      					 print $password. "\t";      					 
      					 print $passwordDb . "\t";  
      					 
      					 //On crée une chaine SHA pour la comparé à la DB      					 
						$secure_password = sha1($sal . sha1($password));
						print $secure_password . "\t";

						if ($secure_password === $passwordDb)
						{
							//traitement récupere les données et on les stock dans une session
							try{ 
								$stmt = $conn->prepare('SELECT IDAgence,Nom,Langue FROM Agence WHERE Mail= :login');
								$stmt->execute(array(':login'=> $login));
		 					  }
	    					catch(PDOException $e){
	            				print "Erreur !: " . $e->getMessage() . "<br/>";
	            				 die();
	      					 } 
	      					 
	      					 while($row = $stmt->fetch(PDO::FETCH_BOTH)){
	       							 session_start();
	       							 $_SESSION['user_id'] = $row[0];
	       							 $_SESSION['user_nom'] = $row[1];
	       							 $_SESSION['user_langue'] = $row[2];
	       							 $check=TRUE;
	      					 }
	      					 
	      					 //Traitement on met a jour un champ
	      					 try{ 
								$stmt = $conn->prepare('UPDATE Agence SET DateDerniereConnexion=now() WHERE Mail= :login');
								$stmt->execute(array(':login'=> $login));
		 					  }
	    					catch(PDOException $e){
	            				print "Erreur !: " . $e->getMessage() . "<br/>";
	            				 die();
	      					 } 
	      					 
						}
						else
						{
							echo 'Error : The password does not match !';
						}

						// On ferme la connexion
						fermeConnexion($conn);
						
					}else  {echo 'Error : Please insert password !'; }
				
			}else  {echo 'Error : Please insert login !'; }		

				
		}
		

if($check === false)
		{
		?>
				<img class="imgLogo"/>
					<br /><br />
				<form method="post" action="index.php">
					<label for="login" class="mesLabel">Username</label>
					<input type="text" name="login" id="login"/>
					<br /><br />
					<label for="password" class="mesLabel">Password</label>
					<input type="password" name="password" id="password"/>
					<br /><br />
					<input type="submit" value="Send" name="envoyer" class="boutonAuth"/>
				</form>
			</div>
	   <?php	
		}
else
{
	//On effectue la redirection vers la partie sécurisée.
	//header('Location: /myserver/service/container.php');
}
		?>
</body>
</html>
D'avance, merci pour votre retour.

Cerbere.

Re: Vos commentaires sur ce code

Posté : 17 févr. 2010, 15:17
par stealth35
hello,
1 :ta pas besoin de faire ton " //Traitement contre injection " puisque tu fais des requête préparer (donc ligne a surpimer)
2 : tu peu comparer directement que ton utilisateur existe puisque sous mysql ta une fonction SHA1
3 : pas trop besoin de fermer la connexion elle se ferme a la fin du script
4 : y'a surment du blabla a virer


ducoup montre ton fichier 'connexion.php'


ps : pour ta requete (en gros) :
SELECT IDAgence,Nom,Langue FROM Agence WHERE Mail= :login AND password = SHA1(sal + SHA1(:password))

Re: Vos commentaires sur ce code

Posté : 17 févr. 2010, 16:31
par Cerbere1980
Mon fichier connexion est assez classique :
<?php

function ouvreConnexion ()
{
	//Information de connexion	
	define('USERNAME','dbuser');
	define('PW','password');
	define('DSN','mysql:host=dbhost;dbname=dbname');
			
			
	try {
		$conn = new PDO(DSN,USERNAME,PW);
	} catch (PDOException $e) {
		print "Erreur !: " . $e->getMessage() . "<br/>";
		die();
	}
	//Retourne la connexion active
	return $conn;
}

function fermeConnexion ($conn)
{
	// Fermeture de la connexion à MSSQL
	$conn=NULL;
}

?>

Re: Vos commentaires sur ce code

Posté : 17 févr. 2010, 17:37
par stealth35
sinon evite les alias aussi, a la place de "die" utilise "exit" :wink: