[ Sécurité ] Mon formulaire est t'il assez sécurisé ?

VaN
Mammouth du PHP | 1107 Messages

14 nov. 2006, 20:38

Bonsoir,

je viens vous soumettre un formulaire de création de compte sur un site, j'aimerais savoir si il est suffisament sécurisé ?
// on initialise la variable d'erreur
		$error = 0;
		// Vérification des données
		$check_pass = strcmp($_POST['password'], $_POST['password2']);
		if($check_pass != '0')
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_password_wrong.'</font><br /><br />';
		}
		
		$check_mail = strcmp($_POST['mail'], $_POST['mail2']);
		if($check_mail != '0')
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_mail_wrong.'</font><br /><br />';
		}
		
		// REGEX pour s'assurer que le login est correct
		strip_tags($_POST['login']);
		
		if(!preg_match('#^(?>[[:alnum:]]+)$#', $_POST['login']))
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_login_unvalid.'</font><br /><br />';
		}
		
		
		// On interdit le < dans le mot de passe
		strip_tags($_POST['password']);
		
		if(!preg_match('<', $_POST['password']))
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_pass_unvalid.'</font><br /><br />';
		}
		
		
		
		// REGEX pour s'assurer que l'e-mail est correcte
		strip_tags($_POST['mail']);
		
		if(!preg_match('`^[[:alnum:]]([-_.]?[[:alnum:]])*@[[:alnum:]]([-.]?[[:alnum:]])*\.([a-z]{2,4})$`', $_POST['mail']))
		{
			$error = 1;
			echo $lang_mail_unvalid;
		}
		
		
		
		// on vérifie que le login est unique
		$sql = 	"SELECT * 
				FROM USERS
				WHERE user_login = '".$_POST['login']."'";
		$query = mysql_query($sql) OR die('Erreur : '.mysql_error());
		$rows = mysql_num_rows($query);
		if($rows != 0)
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_login_used.'</font><br /><br />';
		}
		
		// on vérifie que le mail est unique
		$sql = 	"SELECT * 
				FROM USERS
				WHERE user_mail = '".$_POST['mail']."'";
		$query = mysql_query($sql) OR die('Erreur : '.mysql_error());
		$rows = mysql_num_rows($query);
		if($rows != 0)
		{
			$error = 1;
			echo '<font class=\'error\'>'.$lang_mail_used.'</font><br /><br />';
		}
		
		// Si il y'a pas d'erreur, on fait l'enregistrement
		if($error == 0)
		{
			$sql = 	"INSERT INTO USERS
					VALUES ('', '".$_POST['login']."', '".md5($_POST['password'])."', '".$_POST['mail']."', '0', '0', '0', '".md5($_POST['login'])."')";
			$query = mysql_query($sql);
			
			
			
			$entete = "MIME-Version: 1.0\r\n";
			$entete .= "Content-type: text/html; charset=iso-8859-1\r\n";
			$entete .= "To: $to\r\n";
			$entete .= "From: $from\r\n";
			if(!mail($to, $sujet, $message, $entete))
				echo '<font class=\'error\'>'.$lang_mail_error.'</font>';
			else
				echo $lang_registered.'<br /><br />';
			
			
			exit();
		}
Merci d'avance pour l'attention que vous y porterez : )

Mammouth du PHP | 1776 Messages

14 nov. 2006, 20:47

échappe tes ' ...

VaN
Mammouth du PHP | 1107 Messages

14 nov. 2006, 21:21

comment ça ?

Mammouth du PHP | 1776 Messages

14 nov. 2006, 21:23

sql injection tu ne connais pas ? :shock:

Eléphant du PHP | 197 Messages

14 nov. 2006, 21:29

regarde la fonction mysql_real_escape_string()

sinon vérifie la longueur des entrées str_len() si ma mémoire est bonne

et j'aime pas l'utilisation du md5 comme cryptage, c'est du chiffrage (vérification de l'intégrité des données) pas du cryptage 2 chaines peuvent avoir le même md5, regarde la fontion crypt() tu n'auras pas de problême

Eléphant du PHP | 281 Messages

14 nov. 2006, 22:06

---
Modifié en dernier par Ouaibou le 07 juil. 2007, 11:16, modifié 1 fois.

VaN
Mammouth du PHP | 1107 Messages

15 nov. 2006, 16:32

sql injection tu ne connais pas ? :shock:
j'en ai entendu parlé vaguement. Mais vu que je n'autorise pas les caractères ' et " dans mon formulaire, je pensais que cela empechait egalement les injections.

je vais me renseigner sur mysql_real_escape_string()

Mammouth du PHP | 2937 Messages

15 nov. 2006, 17:47

Salut!
sql injection tu ne connais pas ? :shock:
j'en ai entendu parlé vaguement. Mais vu que je n'autorise pas les caractères ' et " dans mon formulaire, je pensais que cela empechait egalement les injections.

je vais me renseigner sur mysql_real_escape_string()
Même si tu n'autorises pas le caractère ', ne fais jamais confiance à l'utilisateur.

Imagine la requête suivante:
<?php
$sql="SELECT * FROM users WHERE login='$login' AND pass='$pass'";
Rien ne t'empêche de saisir 'Pierre' --' comme valeur pour la variable $login, ce qui donnera la requête suivante à exécuter:

Code : Tout sélectionner

SELECT * FROM users WHERE login='Pierre' --' AND pass=''
Autrement dit, tu viens d'effectuer une injection SQL qui te permet de te connecter sans soumettre ton mot de passe (-- introduisant une ligne de commentaire en SQL)! :shock:

Si on enfermait $login dans la fonction mysql_real_escape_string(), on aurait

Code : Tout sélectionner

SELECT * FROM users WHERE login='Pierre'' --' AND pass=''
et il y aura de fortes chances qu'on te refuse la connexion.

Mammouth du PHP | 1776 Messages

15 nov. 2006, 19:30

De plus, un vrai développeur désactive les magic quotes (qui vont d'ailleurs disparaître en PHP6...) :wink:

Mammouth du PHP | 2937 Messages

16 nov. 2006, 11:33

De plus, un vrai développeur désactive les magic quotes (qui vont d'ailleurs disparaître en PHP6...) :wink:
D'où la fin du monde redouté par un membre de l'équipe. :langue:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 nov. 2006, 13:04

Si on enfermait $login dans la fonction mysql_real_escape_string(), on aurait

Code : Tout sélectionner

SELECT * FROM users WHERE login='Pierre'' --' AND pass=''
Je pense que tu mélange Oracle et MySQL :-k

1/ le caractere de commentaire est # pour MySQL, -- pour Oracle
2/ mysql_real_escape_string() ajoute des / devant les caractères "dangereux" alors qu'avec Oracle, il suffit de doubler les '
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

VaN
Mammouth du PHP | 1107 Messages

21 nov. 2006, 18:59

Imagine la requête suivante:
<?php
$sql="SELECT * FROM users WHERE login='$login' AND pass='$pass'";
Rien ne t'empêche de saisir 'Pierre' --' comme valeur pour la variable $login, ce qui donnera la requête suivante à exécuter:

Code : Tout sélectionner

SELECT * FROM users WHERE login='Pierre' --' AND pass=''
Autrement dit, tu viens d'effectuer une injection SQL qui te permet de te connecter sans soumettre ton mot de passe (-- introduisant une ligne de commentaire en SQL)! :shock:
Justement, pour parrer ce systeme d'injection SQL, j'ai une méthode à moi, qui consiste à, lors d'une authentification, ne pas aller chercher si le couple login/pass existe dans la base, mais a aller chercher seulement le login, et ensuite regarder si son pass SQL est egal au pass fournit dans le formulaire. Cette methode est totalement sécurisée et empeche de s'authentifier sans mot de passe, non ?

Invité
Invité n'ayant pas de compte PHPfrance

26 nov. 2006, 13:56

Je pense que tu mélange Oracle et MySQL :-k

1/ le caractere de commentaire est # pour MySQL, -- pour Oracle
2/ mysql_real_escape_string() ajoute des / devant les caractères "dangereux" alors qu'avec Oracle, il suffit de doubler les '
1/ MySQL accepte ces trois syntaxes : #, -- et /* ... */ pour les commentaires, du moins la version 5 que j ai entre les mains.

2/ mysql_real_escape_string() double les apostrophes.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 nov. 2006, 22:26

1/ MySQL accepte ces trois syntaxes : #, -- et /* ... */ pour les commentaires, du moins la version 5 que j ai entre les mains.
Ah, tiens ... Je ne peut te contredire pour la bonne raison que j'était persuadé de ça et que j'ai jamais testé autre chose
2/ mysql_real_escape_string() double les apostrophes.
:-k là, par contre, je ne voit rien dans la doc qui me confirme tes dires
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 19672 Messages

27 nov. 2006, 00:04

... MySQL accepte ces trois syntaxes : #, -- et /* ... */ pour les commentaires, du moins la version 5 que j ai entre les mains...
Suffit de regarder dans la doc
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: