SECURITE EN PHP

Fermé
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019 - 4 févr. 2019 à 16:54
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre 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
A voir également:

7 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
4 févr. 2019 à 17:42
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....
0
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
4 févr. 2019 à 18:56
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
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
4 févr. 2019 à 19:40
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 ....
0
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
4 févr. 2019 à 22:23
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
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
4 févr. 2019 à 23:05
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);
0
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
Modifié le 5 févr. 2019 à 18:58
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
5 févr. 2019 à 19:09
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);
		}
		
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
5 févr. 2019 à 19:29
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://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
https://forums.commentcamarche.net/forum/affich-37584947-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.
0
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
5 févr. 2019 à 20:49
ok. et merci encore
0
JE2MENAGE Messages postés 7 Date d'inscription lundi 4 février 2019 Statut Membre Dernière intervention 6 février 2019
6 févr. 2019 à 14:20
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.
0