Sécurisation de formulaire

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 914 fois - Téléchargée 15 fois

Contenu du snippet

Bonjour,
j'ai lu sur divers forums que l'injection sql peut etre dangereux si on sécurise mal le traitement des données d'un formulaire vers la page de traitement.
J'ai lu qu'il fallait faire un "mysql_real_escape_string" sur les données postée pour empécher des injections de code du genre "OR a = a" , ou \' OR \'a\'=\'a ..
Je vais partager une partie du code que j'ai mis en place pour renforcer un peu plus la sécurité, dites moi ce que vous en pensez, et si c'est une mauvaise méthode..!
Cette méthode consiste à éviter les "=" ou "<" ou ">" ou "?" ou "+" dans les chaines postées.

Pour un formulaire classique de connection :
<form method="post" name="form_connect" action="traitement_du_fichier.php">
<input type="text" name="pseudo"/>
<input type="password" name="pass" />
<input type="submit" value="ok" name="envoi" />
</form>

Source / Exemple :


if(isset($_POST['pseudo'])){
	$chaine_a_tester=$_POST['nom_du_client'].$_POST['password_du_client'];
	$error="";
// caracteres interdit: = < > + ?
// Si un de ces caractere est dans le $chaine_a_tester, alors on rajoute le chiffre de sa position dans la chaine, dans la variable $error qui ne sera plus vierge: strpos() renvoie ce chiffre.
	$caractere_interdit="=";
	$error.=strpos($chaine_a_tester,$caractere_interdit);
	$caractere_interdit="<";
	$error.=strpos($chaine_a_tester,$caractere_interdit);
	$caractere_interdit=">";
	$error.=strpos($chaine_a_tester,$caractere_interdit);
	$caractere_interdit="?";
	$error.=strpos($chaine_a_tester,$caractere_interdit);
	$caractere_interdit="+";
	$error.=strpos($chaine_a_tester,$caractere_interdit);
		// Si $error est toujours vierge, alors tout est, on peut tester si le pseudo et le password correspondent
	if($error==""){
		$login=mysql_real_escape_string($_POST['nom_du_client']);
		$pass=mysql_real_escape_string($_POST['password_du_client']);
		$sql = "SELECT login,password FROM login WHERE login='".$login."' AND password = '".$pass."'";
		$sql2=mysql_query($sql) or die(mysql_error());
		$slq3=mysql_num_rows($sql2);
		if($sql3==1){
			echo "Login et mot de passe valide";
		}else{
			echo "Login ou mot de passe invalide";
		}

	}else{
// Si la variable $error n'est pas vierge, c'est que les caractere interdits ont été rentrés, peut etre tentative de piratage?!
		echo "Certains champs sont interdit car trop dangereux, et votre pseudo ou mot de pass sont incorrects!";
	}
}

Conclusion :


Il est aussi possible de tester si un champ email est valide avec ce code par exemple:

$adresse=$_POST['pseudo'];
$carac_obligatoire="@";
$carac_arobas=strpos($adresse,$carac_obligatoire);
$carac_obligatoire2=".";
$carac_point=strpos($adresse,$carac_obligatoire2);
if($carac_arobas<0 && $carac_point<0){
echo "Email valide";
}else{
echo "email invalide";
}

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
samedi 24 juillet 2010
Statut
Membre
Dernière intervention
3 août 2010

Autre méthode...

<?php
$erreur = null;
$success = null;
if(!preg_match('#^[a-z0-9\-_]+$#i'$_POST['value1'])) // 1er variable: caractères autorisés, lettres - chiffres - underscores - tirets
{
$erreur = 0;
}
else if(!preg_match('#^[a-z]+$#i'$_POST['value2'])) //2eme variable: caracteres autorisés, lettres
{
$erreur = 0;
}
// else if...
if(empty($erreur)) { // si $erreur toujours null, alors il n'y a pas eu d'erreur donc les variables sont clean
$success = 1
//si requete sql, aouter mysql_real_escape_string
}
echo $success.$erreur; // affichage des resultats, null (si le script n'a pas été exécuté)
?>
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Ah ben je savais pas. Je pensais que comme en ASP3, plusieurs requêtes pouvaient être exécutées.
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
ghuysmans99 -> mysql_query ne permet pas d'avoir plusieurs requêtes en même temps, ça va juste de sortir un exception si tu essaies de faire ça.
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Et pas que des SELECT. Tu entres ça sans les crochets ['or 'a'='a';DELETE * FROM Users WHERE 'a'='a] et ça te fout en l'air ta table (là ça marchera avec du MySQL si la requête du script est [SELECT * FROM Users WHERE user=$user AND pass=$pass;]
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
7
masternico -> Le problème c'est que les injections SQL ne servent pas juste à contourner un login. Tu laisse carrément un accès à n'importe qui de faire des requêtes select. Tout dépendant de la base de données que tu utilises, ça laisse la possibilité d'avoir une fuite de ta base de données au complet.

Exemple d'entrée qui pose problème :

' UNION ALL SELECT * FROM INFORMATION_SCHEMA INTO OUTFILE 'chemin/Accessible/Du/Net.txt
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.