Menu

SECURITE EN PHP

Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
- - Dernière réponse : JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
- 6 févr. 2019 à 14:20
Salut à tous,
je suis nouveau ici et je demande de l'aide à tous, Nous avons bricolé 3 fichiers différents en php et nous souhaitons les harmoniser .
1/ dans un premier fichier nous avons config.php
nous avons ce code
define("SALT","une cle de cryptage");


2/ dans un utre fichier auth.php
nous avons cela
public static function hashPassword($pass){

		return sha1(SALT.md5($pass.SALT).sha1(SALT));
	}


	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}
}


3/ dans un troisième fichier, register.php
nous avons celui là
		$hash_pass = sha1($pass1);
		$q = $db->prepare('INSERT INTO users(pseudo, email, password, ip, created)
						   VALUES(:pseudo, :email, :password, :ip, now())');
		$q->execute(array(
			'pseudo' => $pseudo,
			'email' => $email,
			'password' => $hash_pass,


4/ dans login.php
nous
<?php 

if(isset($_GET['logout'])){
	if(isset($_SESSION['user'])){
		unset($_SESSION['user']);
	}

	$_SESSION['message'] = "Vous êtes maintenant déconnecté.  A bientôt!";
}
	
	if(isset($_POST) && !empty($_POST['password']) && !empty($_POST['email'])){

		$email = addslashes($_POST['email']);
		// modifier sha1 par Auth::hashPassword();
		$password = Auth::hashPassword($_POST['password']);

		$data = array(
				'email'=>$email,
				'password'=>$password
			);

		$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';
		$req = $DB->tquery($sql,$data);
		if(!empty($req)){
			// user existe
			if($req[0]['active'] == 1){
				$_SESSION['user'] = $req[0];
				$_SESSION['user']['role'] = Auth::hashPassword($_SESSION['user']['role']);
				$_SESSION['messasge'] = "Bienvenue , Vous êtes maintenant connecté .";
				header('location:index.php');
			}else{
				$_SESSION['erreur'] = "Compte user non actif ,veuillez vérifier votre méssagerie pour activer le compte";
			}
		}
		else{
			$_SESSION['erreur'] = "Votre email et/ou mot de passe sont invalides !.";
		}

	}


Nous solicitons l'aide de tous car nous voulons harmoniser le tout en utilisant
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

Chose que nous avons dû mal à faire.

merci encore a tous
Afficher la suite 

Votre réponse

7 réponses

Messages postés
24567
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 février 2019
1845
0
Merci
Bonjour,

Tu dois donc modifier ta fonction
public static function hashPassword($pass){
  // return sha1(SALT.md5($pass.SALT).sha1(SALT));
 $options = [
    'cost' => 12,
];
 return   password_hash($pass.SALT, PASSWORD_BCRYPT, $options);
}

Il te faudra également modifier le code de connexion
$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';

par
$sql = 'SELECT * FROM users WHERE email=:email  limit 1';

Puis utiliser la fonction password_verify pour effectuer le test de validité du password....
Commenter la réponse de jordane45
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
Merci bien pour votre disponibilité,
Je viens de texter, mais il y'a des messages d'erreurs dans le fichier register.php et login.php

dans le fichier auth.php
j'ai modifier comme sa
ancien code source
public static function hashPassword($pass){

		return sha1(SALT.md5($pass.SALT).sha1(SALT));
	}


	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}
}

Par celui là
  // return sha1(SALT.md5($pass.SALT).sha1(SALT));
 $options = [
    'cost' => 12,
];
 return   password_hash($pass.SALT, PASSWORD_BCRYPT, $options);
}


dans register.php
ce code
	$hash_pass = sha1($pass1);
		$q = $db->prepare('INSERT INTO users(pseudo, email, password, ip, created)
						   VALUES(:pseudo, :email, :password, :ip, now())');
		$q->execute(array(
			'pseudo' => $pseudo,
			'email' => $email,
			'password' => $hash_pass,
			'ip' => $_SERVER['REMOTE_ADDR']
		));	

je l'es remplacer par celui là
			$password = Auth::hashPassword($_POST['password']);
			$token = sha1(uniqid(rand()));


dans le fichier login.php
je remplace cette ligne
		$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';

par celle là
$sql = 'SELECT * FROM users WHERE email=:email  limit 1';


et voici les message d'erreur
1/ register.php :-FATAl error: Class 'Auth' not found in c/............/register.php on line 98
2/ login.php: fatal error:
Call to undefined function password_hash() in c/......../auth.php on line 30
c'est à dire cette ligne (partie du code)

  // return sha1(SALT.md5($pass.SALT).sha1(SALT));
 $options = [
    'cost' => 12,
];
 return   password_hash($pass.SALT, PASSWORD_BCRYPT, $options);
}


merci encore
jordane45
Messages postés
24567
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 février 2019
1845 -
Déjà... peux tu nous reposter l'intégralité du code modifié ?

ensuite.. en quelle version de PHP es tu ?
Car.. pour rappel.. la fonction password_hash n'est dispo qu'à partir de la 5.5 ....
Commenter la réponse de JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
php 5.5

code modifier du fichier auth.php
<?php 

/**
* Auth
*/
class Auth{
	
	public static function islog($db){
		if(isset($_SESSION['user']) && isset($_SESSION['user']['email']) &&  isset($_SESSION['user']['password'])){

			$data =array(
				'email'=>$_SESSION['user']['email'],
				'password'=>$_SESSION['user']['password']
				);

			$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';
			$req = $db->tquery($sql,$data);

			if(!empty($req)){
				return true;
			}
		}
		return false;
	}


	public static function hashPassword($pass){

    $options = [ 'cost' => 12, ];
		return password_hass($pass.SALT, PASSWORD_BCRYPT, $options);
	}


	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}
}


ensuite le code modifier du fichier register.php
<?php 
//Vérification du pseudo
if(!empty($_POST['pseudo_check'])){ 
	$pseudo = $_POST['pseudo_check'];
	$pseudo = preg_replace('#[^a-z0-9]#i', '', $pseudo); // filter everything but letters and numbers
	if(strlen($pseudo) < 3 || strlen($pseudo) > 16){
		echo '<br/>3 à 16 caractètres SVP.';
		exit();
	}
	
	if(is_numeric($pseudo[0])){
		echo '<br/>Le pseudo doit commencer par une lettre.';
		exit();
	}
	
	//Connexion à la base de données
	require "includes/connect_db.php";
	
	$q = $db->prepare('SELECT id FROM users WHERE pseudo = ?');
	$q->execute(array($pseudo));
	
	$numRows = $q->rowCount();
	if($numRows > 0){
		echo '<br/>Pseudo déjà utilisé !';
		exit();
	} else {
		echo 'success';
		exit();
	}
}

//Vérification des mots de passe
if(!empty($_POST['pass1_check']) && !empty($_POST['pass2_check'])){
	if(strlen($_POST['pass1_check']) < 6 || strlen($_POST['pass1_check'])  < 6){
		echo '<br/>Trop court (6 caractères minimum)';
		exit();
	} else if($_POST['pass1_check'] == $_POST['pass2_check']){
		echo 'success';
		exit();
	} else {
		echo '<br/>Les deux mots de passe sont différents';
		exit();
	}

}

//Vérification de l'email
if(!empty($_POST['email_check'])){
	$email = $_POST['email_check'];
	
	//Vérifier l'adresse mail
	if(!filter_var($email, FILTER_VALIDATE_EMAIL)){  
		echo '<br/>Adresse email invalide !';
		exit();
	}
	//Connexion à la base de données
	require "includes/connect_db.php";
	
	$q = $db->prepare('SELECT id FROM users WHERE email = ?');
	$q->execute(array($email));
	
	$numRows = $q->rowCount();
	if($numRows > 0){
		echo '<br/>Adresse email déjà utilisée !';
		exit();
	} else {
		echo 'success';
		exit();
	}
}

//Traitement de l'inscription
if(isset($_POST['pseudo'])){
	require "includes/connect_db.php"; 
	extract($_POST);
	$pseudo = preg_replace('#[^a-z0-9]#i', '', $pseudo); // filter everything but letters and numbers
	$q = $db->prepare('SELECT id FROM users WHERE pseudo = ?');
	$q->execute(array($pseudo));
	$pseudo_check = $q->rowCount();
	
	$q = $db->prepare('SELECT id FROM users WHERE email = ?');
	$q->execute(array($email));
	$email_check = $q->rowCount();
	
	if(empty($nom) || empty($prenom) || empty($pseudo)|| empty($pass1) || empty($pass2) || empty($email)){
		echo "Tous les champs n'ont pas été remplis.";
	} else if($pseudo_check > 0) {
		echo "Pseudo déjà utilisé";
	} else if($email_check > 0) {
		echo "Cette adresse mail est déjà utilisée";
	} else if(strlen($pseudo) < 3 || strlen($pseudo) > 16) {
		echo "Pseudo éronné !";
	}  else if(is_numeric($pseudo[0])) {
		echo "Le pseudo doit commencer par une lettre.";
	}  else if($pass1 != $pass2) {
		echo "Les mots de passe ne correspondent pas.";
	} else {
		$password = Auth::hashPassword($_POST['password']);
			$token = sha1(uniqid(rand()));
		$q = $db->prepare('INSERT INTO users(pseudo, email, password, token, ip, created_at)
						   VALUES(:pseudo, :email, :password, :token, :ip, now())');
		$q->execute(array(
			'pseudo' => $pseudo,
			'email' => $email,
			'password' => $hash_pass,
			'token' => $token,
			'ip' => $_SERVER['REMOTE_ADDR']
		));	
		
		$user_id = $db->lastInsertId();

		if(!file_exists( "members/$user_id")){
			mkdir("members/$user_id", 0755);
		}


et enfin le fichier login.php
<?php 

if(isset($_GET['logout'])){
	if(isset($_SESSION['user'])){
		unset($_SESSION['user']);
	}

	$_SESSION['message'] = "Vous êtes maintenant déconnecté.  A bientôt!";
}
	
	if(isset($_POST) && !empty($_POST['password']) && !empty($_POST['email'])){

		$email = addslashes($_POST['email']);
		// modifier sha1 par Auth::hashPassword();
		$password = Auth::hashPassword($_POST['password']);

		$data = array(
				'email'=>$email,
				'password'=>$password
			);

		$sql = 'SELECT * FROM users WHERE email=:email AND password=:password limit 1';
	//	$sql = 'SELECT * FROM users WHERE email=:email limit 1';
		$req = $DB->tquery($sql,$data);
		if(!empty($req)){
			// user existe
			if($req[0]['active'] == 1){
				$_SESSION['user'] = $req[0];
				$_SESSION['user']['role'] = Auth::hashPassword($_SESSION['user']['role']);
				$_SESSION['messasge'] = "Bienvenue , Vous êtes maintenant connecté .";
				header('location:index.php');
			}else{
				$_SESSION['erreur'] = "Compte user non actif ,veuillez vérifier votre méssagerie pour activer le compte";
			}
		}
		else{
			$_SESSION['erreur'] = "Votre email et/ou mot de passe sont invalides !.";
		}

	}
 require 'includes/header.php';?>

 <!-- message de session -->
<?php if (isset($_SESSION['message'])): ?>
  <div class="message"> <?php echo $_SESSION['message']; ?></div>
  <?php unset($_SESSION['message']) ?>
<?php endif ?>
<?php if (isset($_SESSION['erreur'])): ?>
  <div class="errorMessage"> <?php echo $_SESSION['erreur']; ?></div>
  <?php unset($_SESSION['erreur']) ?>
<?php endif ?>

<!-- formulaire d'inscription  -->

<form action="login.php" method="post" id="login">
	
	<h2>Connexion</h2>

		<p>
			<label for="email" >Email :</label>
			<input type="email" name="email" id ="email" value="<?php echo isset($_POST['email'])?$_POST['email']:''; ?>">
		</p>
		<?php if (!empty($erreur_email)): ?>
			<div class="error"><?php echo $erreur_email; ?></div> 
		<?php endif ?>
		<p>
			<label for="password" >Mot de passe :</label>
			<input type="password" name="password" id ="password">
		</p>
		<?php if (!empty($erreur_password)): ?>
			<div class="error"><?php echo $erreur_password; ?></div> 
		<?php endif ?>
	<p>
		<input type="submit" value ="Se connecter">
	</p>
</form>


Merci encore pour votre assistance
jordane45
Messages postés
24567
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 février 2019
1845 -
En même temps.. normal...
ce n'est pas
return password_hass($pass.SALT, PASSWORD_BCRYPT, $options);

mais
return password_hash($pass.SALT, PASSWORD_BCRYPT, $options);
Commenter la réponse de JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
Salut Jordane
Après plusieurs éssaie et changement j'ai toujours le même message d'erreur.

mais quand je change la fonction en SHA1, sa passe sans souci.

j'ai aussi changer la version de PHP 5.5 à 5.6.

Fatal error: Class 'Auth' not found in C:\Program Files (x86)\EasyPHP-Devserver-17\eds-www\register.php on line 98

auth.php
	public static function hashPassword($pass){

    $options = [ 'cost' => 12, ];
		return password_hash($pass.SALT, PASSWORD_BCRYPT, $options);
	}


	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}
}


register.php on line 98
$password = Auth::hashPassword($_POST['password']);
		

Merci encore
Commenter la réponse de JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
Et voici mon fichier register.php
<?php 
//Vérification du pseudo
if(!empty($_POST['pseudo_check'])){ 
	$pseudo = $_POST['pseudo_check'];
	$pseudo = preg_replace('#[^a-z0-9]#i', '', $pseudo); // filter everything but letters and numbers
	if(strlen($pseudo) < 3 || strlen($pseudo) > 16){
		echo '<br/>3 à 16 caractètres SVP.';
		exit();
	}
	
	if(is_numeric($pseudo[0])){
		echo '<br/>Le pseudo doit commencer par une lettre.';
		exit();
	}
	
	//Connexion à la base de données
	require "includes/connect_db.php";
	
	$q = $db->prepare('SELECT id FROM users WHERE pseudo = ?');
	$q->execute(array($pseudo));
	
	$numRows = $q->rowCount();
	if($numRows > 0){
		echo '<br/>Pseudo déjà utilisé !';
		exit();
	} else {
		echo 'success';
		exit();
	}
}

//Vérification des mots de passe
if(!empty($_POST['pass1_check']) && !empty($_POST['pass2_check'])){
	if(strlen($_POST['pass1_check']) < 6 || strlen($_POST['pass1_check'])  < 6){
		echo '<br/>Trop court (6 caractères minimum)';
		exit();
	} else if($_POST['pass1_check'] == $_POST['pass2_check']){
		echo 'success';
		exit();
	} else {
		echo '<br/>Les deux mots de passe sont différents';
		exit();
	}

}

//Vérification de l'email
if(!empty($_POST['email_check'])){
	$email = $_POST['email_check'];
	
	//Vérifier l'adresse mail
	if(!filter_var($email, FILTER_VALIDATE_EMAIL)){  
		echo '<br/>Adresse email invalide !';
		exit();
	}
	//Connexion à la base de données
	require "includes/connect_db.php";
	
	$q = $db->prepare('SELECT id FROM users WHERE email = ?');
	$q->execute(array($email));
	
	$numRows = $q->rowCount();
	if($numRows > 0){
		echo '<br/>Adresse email déjà utilisée !';
		exit();
	} else {
		echo 'success';
		exit();
	}
}

//Traitement de l'inscription
if(isset($_POST['pseudo'])){
	require "includes/connect_db.php"; 
	extract($_POST);
	$pseudo = preg_replace('#[^a-z0-9]#i', '', $pseudo); // filter everything but letters and numbers
	$q = $db->prepare('SELECT id FROM users WHERE pseudo = ?');
	$q->execute(array($pseudo));
	$pseudo_check = $q->rowCount();
	
	$q = $db->prepare('SELECT id FROM users WHERE email = ?');
	$q->execute(array($email));
	$email_check = $q->rowCount();
	
	if(empty($nom) || empty($prenom) || empty($pseudo)|| empty($pass1) || empty($pass2) || empty($email)){
		echo "Tous les champs n'ont pas été remplis.";
	} else if($pseudo_check > 0) {
		echo "Pseudo déjà utilisé";
	} else if($email_check > 0) {
		echo "Cette adresse mail est déjà utilisée";
	} else if(strlen($pseudo) < 3 || strlen($pseudo) > 16) {
		echo "Pseudo éronné !";
	}  else if(is_numeric($pseudo[0])) {
		echo "Le pseudo doit commencer par une lettre.";
	}  else if($pass1 != $pass2) {
		echo "Les mots de passe ne correspondent pas.";
	} else {
		$password = Auth::hash_Password($_POST['password']);
			$token = sha1(uniqid(rand()));
		$q = $db->prepare('INSERT INTO users(pseudo, email, password, token, ip, created_at)
						   VALUES(:pseudo, :email, :password, :token, :ip, now())');
		$q->execute(array(
			'pseudo' => $pseudo,
			'email' => $email,
			'password' => $hash_pass,
			'token' => $token,
			'ip' => $_SERVER['REMOTE_ADDR']
		));	
		
		$user_id = $db->lastInsertId();

		if(!file_exists( "members/$user_id")){
			mkdir("members/$user_id", 0755);
		}
		
jordane45
Messages postés
24567
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 février 2019
1845 -
Déjà...
je vois , à plusieurs endroits dans ton code ...des
require "includes/connect_db.php";

Il n'en faut qu'un au début de ton script !

Ensuite, je ne vois pas l'include de ta class Auth

Je vois également que tu n'appliques pas les conseils concernant l'exécution des requêtes PDO ni l'activation des erreurs PHP
Je t'invite donc à appliquer le contenu de ces deux liens :
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Si les soucis persistent après avoir mis en application ces conseils.. reviens nous voir avec le code modifié et les éventuels messages d'erreurs.
Commenter la réponse de JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
ok. et merci encore
Commenter la réponse de JE2MENAGE
Messages postés
7
Date d'inscription
lundi 4 février 2019
Dernière intervention
6 février 2019
0
Merci
ok, je corrige et je vous reviens.
Mais avec ce code dans notre fichier auth.php
public static function hashPassword($pass){
		return sha1(SALT.md5($pass.SALT).sha1(SALT));
	}
	public static function isadmin($db){
		if(isset($_SESSION['user']['role']) && (Auth::hashPassword('admin')  == $_SESSION['user']['role'])){
			return true;
		}
		return false;
	}
}

Tous passe bien. mais c'est parce qu'on veux améliorer la sécurité qu'on juger utile d'utiliser le password_hash. et c'est d'ailleurs cette nouvelle fonction (password_hash) qui n'est pas reconnu.
Commenter la réponse de JE2MENAGE