Un MD5 qui n'en est pas un ?!

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 08:16

Il était marqué cela sur le site : site du zero...
sa remplace tout les charters spéciaux pas leur code (comme le signe copyright = ©)

Mais j'ai trouvé mieux !

mysql_real_escape_string($var)

:D

Mammouth du PHP | 19672 Messages

11 août 2011, 08:31

Mouais, mais ça aussi, c'est un mélange assez savant de tout et n'importe quoi. :non:

Si tu souhaites avancer dans ton apprentissage, il va falloir que tu fasses preuve d'un peu de discernement. Pour commencer, je serais tenté de te demander de m'expliquer ce que tu as compris de ce qu'est une injection SQL, si possible en donnant un exemple et en expliquant à quoi ça sert. Pourquoi je te demande ça : tout simplement parce que, bien entendu, tout le monde ou presque a entendu parler d'injection SQL qu'on relie assez naturellement avec le piratage de sites web, mais dans la pratique il y a beaucoup moins de gens qui savent réellement de quoi il retourne. Du coup on voit des [soi-disant] développeurs qui croient plus ou moins savoir, voire même l'affirment volontiers, qui utilisent certains bouts de codes « parce qu'on leur a dit que ça servait contre l'injection SQL » mais sans avoir la moindre idée du comment ni du pourquoi, et éventuellement de façon totalement inutile ou inappropriée.

Or se protéger de quelque chose, c'est commencer par en comprendre la nature.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 08:56

Et bien, j'ai fais des recherche bien évidement sur comment protéger son site. Et la première chose sur la quelle je suis tombé, est l'injection SQL. Qui est (explication dans mes paroles)

Bon.. en faite pour les explication je suis pas fort mais pour un exemple, c'est facile pour moi donc : c'est une personne qui dans un formulaire d'inscription par exemple met un code d'une exécution MySQL quel qu'on-que dnas la parti de l'username par exemple et ensuite, se connecte au site en mettant son code. Le code va s'exécuter lors de la connections.
Et c'est avec ça que tu pourrais effacer des tables entière ou en modifier.

Enfin... d'après ce que j'en est compris en tout cas ^.^ Alors j'apprends vite !? :D

PS. Je pense que je viens de dire a tout le monde comment faire une injection SQL... Mais bon pas grave j'ai aussi dit comment la contrer ! :D

Mammouth du PHP | 19672 Messages

11 août 2011, 09:37

Disons que tu as correctement compris les bases fondamentales. Et en fin de compte ça signifie quoi : qu'il faut être strict lorsqu'on développe et qu'avec un formulaire on ouvre une porte à l'utilisateur. Mais on ne connait pas forcément ce dernier, on ne sais même en général même pas qui il est. On doit donc filtrer sévèrement les données qu'il envoie de façon à ce que rien d'imprévu ne se produise, et donc que rien dans les données qu'il envoie ne puisse être interprété comme du code exécutable par le système.

Tu disais « Je pense que je viens de dire a tout le monde comment faire une injection SQL » mais ce n'est pas un soucis, au contraire, dans la mesure où on est capable d'anticiper les actions possibles avec le code dans l'état où il se trouve. ça signifie qu'on comprend bien le déroulement de l'exécution du programme et comment sont traitées les données. Le risque d'effacement de données voire de tables complètes suppose qu'on est capable de s'identifier comme admin ou encore qu'on peut envoyer du code SQL dans un formulaire d'identification. L'anticipation du développeur lui permet de voir comment transformer une requête normale en requête de destruction et, ce faisant, comment s'en prémunir en filtrant les données reçues.

Exemple : tentative d'identification comme admin : au lieu d'envoyer par exemple l'identifiant « admin » dans le champ Login du formulaire, je mets « admin' OR '1' = '1 », que va-t-il se passer à l'exécution ?
Ma requête d'identification normale sera par exemple :
$login = $_POST['login'];
$password = $_POST['password'];
$sql = "SELECT COUNT(*) FROM users WHERE login = '". $login ."' AND password = '". $password ."'";
La requête qui sera envoyé vers la base sera :
SELECT COUNT(*) FROM users WHERE login = 'admin' OR '1' = '1' AND password = 'abcd1234'
Ça va donner quoi si on ne protège par le code contre ça à ton avis ??
Et donc comment sécuriser ce code ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 août 2011, 09:43

c'est peu prés ça. la seule chose que peux y redire pour une définition au si simple c'est que l'on injecte du code SQL et non MySQL.

Pourquoi cette différence ? SQL c'est une "norme" prévue pour standardiser le dialogue avec les SGBD (dont mysql fait partis).

Ceci dit aucun developpeur n'est obligatoirement tenu de s'y conformer. Ils le font tous plus ou "bien" mais ce n'est pas exact.

Par exemple le "enum" de mysql ne fait pas partie de la norme c'est du "pure" mysql, tu ne retrouvera null par ailleurs (il existe d'autre façon de la faire avec les domaines, qui font partie de la norme mais mysql n’implémente pas depuis si longtemps).

bref on parle de SQL en général et de "MySQL" si tu précis le SGBD, mais pour être sur de bien b**** le gars que l'on "hack" on utilise un truc standard on fait du pif o mettre si non c'est encore plus longs :)


@+
Il en faut peu pour être heureux ......

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 10:36

@Cyrano
Je pense que pour protéger se script il faut faire :
$login = mysql_real_escape_string($_POST['login']);
$password = mysql_real_escape_string($_POST['password']);
$sql = "SELECT COUNT(*) FROM users WHERE login = '". $login ."' AND password = '". $password ."'";
Juste besoin de mettre : mysql_real_escape_string(string) :D Je pense avoir bien appris avec ton explication et exemple :D


@moogli
Merci beaucoup pour ton explication ! Je vais pouvoir me coucher moins con se soire. :D Même s'il est passé minuit...

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 10:44

J'avance bien dans mon site mais j'ai un problème... or du commun je pense.
<?php
$pseudo = mysql_real_escape_string($_SESSION['username']);
$query = mysql_query("SELECT password, birthday, email, banned, banreason FROM accounts WHERE name = '".$pseudo."'") or die ("Error 1");

while ($row = mysql_fetch_assoc($query)) {
$email = mysql_real_escape_string($row["email"]);
$ban = mysql_real_escape_string($row["banned"]);
}

if ($ban = NULL || $ban < 1) {$bancheck = 'Non'}
else{$bancheck = 'Oui'};
?>
Es-ce car on ne peut pas faire une variable = 'mot' ?
J'ai l'érreur : Parse error: syntax error, unexpected '}' in C:\wamp\www\index.php on line 95

Ligne 95 : if ($ban = NULL || $ban < 1) {$bancheck = 'Non'}
else{$bancheck = 'Oui'};

ViPHP
ViPHP | 4039 Messages

11 août 2011, 10:47

ça manque singulièrement de point-virgules, ne trouves-tu pas ? :mrgreen:

Par simple curiosité pédagogique, comment abordes-tu l'apprentissage du Php ? Une formation ? Un bouquin ? Un site particulier ? Une connaissance ?
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 11:07

On met un ; avant un else ?

Sinon, non sa ne marche pas avec un ;

Mais j'apprends le php via des sites à tutoriels et regardant des exemples (je suis très visuel)

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 11:30

J'ai tenté.
if ($ban < '1') {
$bancheck = 'Non'};
elseif ($ban > '0') {
$bancheck = 'Oui'};
Pareil. Sa pointe toujours le } de : $bancheck = 'Non'};

ViPHP
ViPHP | 4039 Messages

11 août 2011, 11:34

Alors je te laisse jouer au jeu des 7 erreurs alors...
if ($ban < '1') {
   $bancheck = 'Non';
   }
else if ($ban > '0') {
   $bancheck = 'Oui';
   }
Il faut un point-virgule derrière chaque commande. les if/else sont des structures de contrôlé, et les accolades de regroupement.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

gnome
Invité n'ayant pas de compte PHPfrance

11 août 2011, 11:39

ahhh ! :shock: oui c'est vrais !
Je suis un peu trop fatigué je pense pour continuer mon site haha
Quand on est rendu à plus voir se genre de chose (que normalement j'ai jamais eu ce problème avant) .... :P

Merci à toi ! Moi je vais dodo.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 août 2011, 19:45

pour mettre un peux d'eau a ton moulin : il est possible d'omettre un ; sur la dernière instruction avant un ?>

par exemple <?php echo $truc ?> est valide :)


@+
Il en faut peu pour être heureux ......