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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [ Sécurité ] Mon formulaire est t'il assez sécurisé ?

par Cyrano » 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

par zeus » 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

par Invité » 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.

par VaN » 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 ?

par zeus » 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 '

par Victor BRITO » 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:

par DocType » 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:

par Victor BRITO » 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.

par VaN » 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()

par Ouaibou » 14 nov. 2006, 22:06

---

par HanX » 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

par DocType » 14 nov. 2006, 21:23

sql injection tu ne connais pas ? :shock:

par VaN » 14 nov. 2006, 21:21

comment ça ?

par DocType » 14 nov. 2006, 20:47

échappe tes ' ...

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

par VaN » 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 : )