Fonction de ce code

Répondre
jackbocar
le 04/08/2009 à 08:32
jackbocar
Bonjour,

J'aimerai que l'on me dise si c'est possible pourquoi lorsque j'ajoute ces deux ligne de code :

<?php
$username = mysql_escape_string($username);
$password = mysql_escape_string($password);
?>


Le control alpha numérique n'est plus valide. Ce qui veut dire que je peux ajouter des chiffres au login et au mot de passe.

Ce qui est incroyable, c'est que tout fonctionne très bien, le code prend très bien les logins avec des chiffres et idem pour les mots de passes.

Et les données sont elles aussi très biens enregistrées puisqu'on peut se connecter avec les logins et passwords avec chiffres.

Lorsque l'on se connecte à la page des membres, la fonction qui control les caractères alphanumériques, accepte très bien les mots de passes avec des chiffres idem pour les logins.

Et lorsque j'envoie le mot de passe : ' or 1=1--, là j'ai une alerte qui me dit que le mot de passe doit être alphanumérique.

Toutes les alertes de mauvais mot de passe ou mauvais login fonctionne très bien.


<?php
session_start();

/*** Ici on Vérifie que le les champs sont biens été remplis ***/
if(!isset( $_POST['username'], $_POST['password'], $_POST['form_token']))
{
$message = 'Please enter a valid username and password';
}
/*** Verifier que la session est valide - on envoie une alerte si ce n'est pas le cas ***/
elseif( $_POST['form_token'] != $_SESSION['form_token'])
{
$message = 'Soumission Invalide du formulaire';
}
/*** Vérifier la longueur du nom d'utilisateur ***/
elseif (strlen( $_POST['username']) > 20 || strlen($_POST['username']) < 6)
{
$message = "La longueur du nom d'utilisateur est incorrect";
}
/*** Vérifier la longueur du mot de passe ***/
elseif (strlen( $_POST['password']) > 20 || strlen($_POST['password']) < 6)
{
$message = "La Longueur du Password est incorrect";
}
/*** Vérifier que le nom d'utilisateur comporte que de caractères alphanumériques ***/
elseif (ctype_alnum($_POST['username']) != true)
{
/*** Si ce n'est pas le cas, une alerte est envoyée ***/
$message = "Le Nom d'utilisateur doit être alpha numérique";
}
/*** Vérifier que le mot de passe comporte que de caractères alphanumériques ***/
elseif (ctype_alnum($_POST['password']) != true)
{
/*** Si ce n'est pas le cas, une alerte est envoyée ***/
$message = "Le Password doit être alpha numérique";
}
else
{
/*** Si tout va bien, c'est que les informations sont valides, nous pouvons les inscrire dans la base de données ***/
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING);
$password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);

/*** Maintenant, nous pouvons chiffrer le mot de passe ***/
$password = sha1( $password );


/*** CES DEUX LIGNES QUI PROTEGENT LES DONNEES INSEREES ***/

/*** Ici on protège les informations ***/
$username = mysql_escape_string($username);
$password = mysql_escape_string($password);



$mysql_hostname = '***';
$mysql_username = '***';
$mysql_password = '***';
$mysql_dbname = 'membres_test';

try
{
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
/*** $message = Nous informe de la bonne connection à la base de données ***/

/*** Ici on fixe le mode des erreurs et excptions ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

/*** Préparation à l'insertion ***/
$stmt = $dbh->prepare("INSERT INTO membres_users (username, password ) VALUES (:username, :password )");

/*** Ici on fait la liaison des paramètres ***/
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
$stmt->bindParam(':password', $password, PDO::PARAM_STR, 40);

/*** Ici on exécute la requête préparée ***/
$stmt->execute();

/*** Ici on défini les variables de session ***/
unset( $_SESSION['form_token'] );

/*** On confirme la bonne insertion du nouvel utilisateur ***/
$message = 'Nouvel utilisateur ajouté';
}
catch(Exception $e)
{
/*** Ici on vérifie si le nom d'utilisateur existe déjà ***/
if( $e->getCode() == 23000)
{
$message = 'Cet utilisateur existe déjà';
}
else
{
/*** Si on a un problème avec la base de données ou avec le serveur ***/
$message = "Nous ne pouvons pas traiter votre demande. S'il vous plaît essayer à nouveau plus tard";
}
}
}
?>


<html>
<head>
<title>Insertion d'un nouvel utilisateur</title>
</head>
<body>
<p>
<?php echo $message; ?>

</p>
</body>
</html>

Jack Bocar
LA GLOBULE
le 04/08/2009 à 14:16
LA GLOBULE
Je ne suis pas sur de comprendre ton soucis, et je ne vois pas trop le rapport avec mysql_escape_string.

Le control alpha numérique n'est plus valide. Ce qui veut dire que je peux ajouter des chiffres au login et au mot de passe.


Le controle alphanumérique se fait avant de faire ton mysql_escape_string, donc il n'y a pas de lien.
D'autre part, les chiffres sont considérés comme valides avec la fonction ctype_alnum. Pour t'en convaincre, fais un simple test du genre :

<?php
$pom = 'polom1';

if (ctype_alnum($pom)) echo 'alnum';
else echo 'pas alnum';
?>


Et lorsque j'envoie le mot de passe : ' or 1=1--, là j'ai une alerte qui me dit que le mot de passe doit être alphanumérique.


Ce qui est logique car l'espace ou les tirets ne sont pas considérés comme valides.

En effet, prenons l'exemple suivant :

<?php
$pom = ' or 1=1--';

if (ctype_alnum($pom)) echo 'alnum';
else echo 'pas alnum';
?>


Le résultat est 'pas alnum'.
jackbocar
le 04/08/2009 à 15:24
jackbocar
Merci de ta réponse

Lorsque j'ai testé ce code sans mettre les « mysql_escape_string », je ne pouvais pas entrer comme login decembre25, pas plus que pour mot de passe du genre MyuxvBNxx25, le code refusait systématiquement car il y a des chiffres dans le login ou dans la password.

Lorsque j'ai mis ses « mysql_escape_string » pour protéger les entrées dans la base de données, j'ai refait les mêmes essais, et là, le code acceptait les login avec des chiffres idem pour les password.

Comment peux-tu expliquer cela ?

Jack Bocar
jackbocar
le 04/08/2009 à 16:10
jackbocar
Désolé, je ne comprends pas ce qu'il se passe, j'ai réécris le code, théoriquement, il ne devrait accepter que les login et pawword en alpha numérique.
Et bien il accepte même les chiffres et les lettres. Cela provient peut-être du changement de WampServer,

J'avais au début des tests PHP 5.2.9-2 et je suis passé à PHP 5.3.0

Idem pour MYSQL, j'avais MySQL 5.1.33, je suis passé à MySQL 5.1.36.

Idem pour PHPMYADMIN, j'avais phpMyAdmin 3.1.3.1, je suis passé à phpMyAdmin 3.2.0.1.

Je vais refaire tous mes test sur Ubuntu et voir si c'est la même chose.

Jack Bocar
LA GLOBULE
le 04/08/2009 à 18:21
LA GLOBULE
Mais alphanumérique, ca veut dire lettres ET chiffres.

Donc a priori le comportement est correct.

Et mysql_escape_string ne fait qu'échapper les données que tu injectes dans une requete SQL, cela ne peut pas fausser un test alphanumérique.

Ce que je veux dire c'est que tu as 2 phases distinctes lors du déroulement du code :
- une phase ou tu testes tes données (message d'erreur ou non)
- une phase où tu fais ton insert SQL, et la tu utilises mysql_escape_string pour te protéger des injections SQL
jackbocar
le 04/08/2009 à 19:04
jackbocar
Bonjour,

Mais alphanumérique, ca veut dire lettres ET chiffres.

Tu as raison, si j'étais acrobate, je me foutrais des coups de pieds au cul

Jack Bocar
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours