SÉCURITÉ : EVITER LES INJECTIONS SQL ET LES ACCÈS AUX PAGES SANS AUTORISATIONS S

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 6 oct. 2007 à 23:02
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007 - 9 oct. 2007 à 20:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44294-securite-eviter-les-injections-sql-et-les-acces-aux-pages-sans-autorisations-special-popup

phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
9 oct. 2007 à 20:51
alors,
je vais etre bref;
la page authentification.php (verification du login et mdp):
<?php (ou <?, je vois pas la différence)

function password_encode($filter, $str)
{
$filter = md5($filter);
$letter = -1;
$newpass = '';

$strlen = strlen($str);

for ( $i = 0; $i < $strlen; $i++ )
{
$letter++;

if ( $letter > 31 )
{
$letter = 0;
}

$neword = ord($str{$i}) + ord($filter{$letter});

if ( $neword > 255 )
{
$neword -= 256;
}

$newstr .= chr($neword);

}

return base64_encode($newstr);
}

$username = $_POST['username'];
$password = $_POST['password'];

$filtre= "toto";

$log_enc=password_encode($filtre, $username);

$mdp_enc=password_encode($filtre, $password);

?>

<SCRIPT language="JavaScript1.1">

larg = screen.width;
haut = screen.height;

fen = window.open("popup.php?code1=<?echo$log_enc;?>&code2=<?echo$mdp_enc;?>",'page',
'toolbar=0, location=0, directories=0, status=0, scrollbars=1, resizable=0, copyhistory=0, menuBar=0,fullscreen=0,width='+screen.width+', height='+screen.height);
</SCRIPT>

page popup.php

<title></title>
<?

$log_enc=$_GET['code1'];
$mdp_enc=$_GET['code2'];

?>
<FRAMESET COLS="125,*" FRAMEBORDER="no" BORDER="0" FRAMESPACING="0">
<FRAME SRC="menu.html" name="gauche" scrolling=no>

<FRAME SRC="accueil.php?code1=<?echo$log_enc;?>&code2=<?echo$mdp_enc;?>" name=corps>
</FRAMESET>
</FRAMESET>

accueil.php:

<?php
session_start();

$log_enc= $_GET['code1'];
$mdp_enc= $_GET['code2'];

$_SESSION['login']=$log_enc;
$_SESSION['mdp']=$mdp_enc;

?>
<script language=javascript>

window.location.replace("page1.php");

</script>

là j'ai réussi a mettre en session le login et le mot de passe, en crypté

je vous laisse deviner la suite ;)

merci a MERKHALED pour les fonctions de cryptage/décryptage ca été très utile
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 20:38
Nix est comme tout le monde : on supprime un code quand on a de bonnes raisons de le faire. Dans ce cas, pas de soucis. Sinon, soucis. Normal quoi.
Bon...on arrête les commentaires n'ayant aucun rapport avec ce code.
PHPAJAX, t'en es où de tes déboires avec les sessions ?
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
9 oct. 2007 à 20:32
et au moins entre le 06 et le 08 l'auteur aura pris conscience de la domination du <?php sur le <?, meme si ca ne sert a personne

(il parait que nix n'aime pas que les admins suppriment trop de codes (il parait) )
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 14:40
JE Peux supprimer des commentaires ;-)
Non ce n'est pas nouveau, ça a tjrs été ainsi.

Oui il y a un anti-flood.
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
9 oct. 2007 à 14:01
ah on peux supprimer des commentaires ?
c'est nouveau ca nan ?
Sinon (j'ai pas testé pour pas polluer) mais est-ce qu'il y a un laps de temps entre deux posts de commentaires ? car ca risque de vite flooder nos boites non ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 oct. 2007 à 13:53
Ce code a l'intérêt de montrer une autre façon de valider une identification. C'est pour ça que je le laisse. Même si là, dans ce cas précis, je n'en vois pas l'utilité.
Mais ça peut l'être dans d'autres cas. Mais oui...en effet, il y a toujours la suppression du code si les choses n'avancent pas dans le bon sens. Ou des commentaires...
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
9 oct. 2007 à 08:57
sinon il y a l'option "supprimer ce code" ou un truc du genre dans ton panneau de gestion, si je me trompe pas, n'est-ce pas Malalam ?

Cette discussion n'a pas lieu d'être ici, mais plutot dans un forum... a mon avis ...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 23:13
De toute manière, ça ne sert strictement à rien d'écrire "up". Si les gens n'ont pas envie de répondre, ils ne répondent pas. Et si les emails reçus à cause de ces "up" ne leur plaisent pas, ils finiront par ne plus aller voir.
Mais "up" DANS un commentaire, c'est stupide, PHPAJAX. Le site ne t'obéit pas en remontant ton thread en haut...t'es pas sur un forum, et au cas où tu ne l'aurais pas remarqué, les codes ne bougent jamais de place. Quoi que tu fasses.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 23:01
down ! cette fois ci c'est trop... serieux, c'est un procede que je trouve revoltant...
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 22:59
<?php

function password_decode($filter, $str)
{
$filter = md5($filter);
$letter = -1;
$newstr = '';
$str = base64_decode($str);
$strlen = strlen($str);

for ( $i = 0; $i < $strlen; $i++ )
{
$letter++;

if ( $letter > 31 )
{
$letter = 0;
}

$neword = ord($str{$i}) - ord($filter{$letter});

if ( $neword < 1 )
{
$neword += 256;
}

$newstr .= chr($neword);
}

return $newstr;
}

function password_encode($filter, $str)
{
$filter = md5($filter);
$letter = -1;
$newpass = '';

$strlen = strlen($str);

for ( $i = 0; $i < $strlen; $i++ )
{
$letter++;

if ( $letter > 31 )
{
$letter = 0;
}

$neword = ord($str{$i}) + ord($filter{$letter});

if ( $neword > 255 )
{
$neword -= 256;
}

$newstr .= chr($neword);

}

return base64_encode($newstr);
}

// exemple d'utilisation :

$str = 'Salut ça va ?';

echo 'phrase d\'origine : ' , $str , '
';

$str1 = password_encode('mot de passe', $str);

echo 'encodage en utilisant le mot de passe "mot de passe" : ' , $str1 , '

';

$str = password_decode('mot de passe', $str1);

echo 'décodage de ' , $str1 , ' avec le bon mot de passe : ' , $str , '
';

$str = password_decode('mot de passe2', $str1);

echo 'décodage de ' , $str1 , ' avec le mot de passe "mot de passe2" : ' , $str , '

';

?>
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 22:45
dans le popup j'arrive a récupérer les sessions, je pense a créer une fonction de cryptage du login et du mot de passe, les passer en url , et les décrypter dans la page1.php.

quelqun aurait une idée pour une fonction de crypatage?

coucou747, up ! et merci pour tes commentaires tres constructifs !
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 22:28
mais je trouve que c'est pas logique... j'arrive a récupérer les sessions dans le popup, mais pas dans les frames !

coucou747, tu aurait peut etre une explication ? ou une solution? sachant que les variables session sont le pseudo et le mot de passe, et que je préfère pas les envoyer dans l'url.
titou_doc Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 22:20
la question n'était pas là.
comme plus haut j'ai compris qu'il etait pas sur de sa config (de PHP), je me demander si il pouvait pas essayer sur un serveur tel que free? par exemple!

mais bon PHPAJAX tu as donc la main sur la config de ton serveur, puisqu'il t'est dedier.

la ou je bosse, il modifie la config du serveur de temps a autre, je bosse aussi a la maison et un beau jour les sess ne marchaient plus a mon taff, apres une journée a retourner mon code je me suis rendue compte que la config de PHP avait changé, aprés explication a l'admin de la boite (qui capte pas grand choses au PHP) et modif tout est rentré dans l'ordre.

voili...voilou
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 22:06
"il parait qu'il faut envoyer le sessionid qd on utilise des frames" -> ou t'as lu ca ???

en local ou ailleur, ca change quoi ? c'est pas le fait que la machine appartienne a une entreprise qui fait quel est l'os, et quel est la version de php, ni sa conf... bref...
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 22:05
non je travaille en ligne, sur un serveur dédié sous Linux gentoo
titou_doc Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 22:03
tu n'essaie qu'en local chez toi
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 21:54
TITOU_DOC ca ne change rien le fait d'ajouter session_start() dans test_popup.php, il parait qu'il faut envoyer le sessionid qd on utilise des frames...

malalam ca marche chez toi ??? c'est que le probleme vient de ma config de php ?
titou_doc Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 21:50
pardon j'oublie les balise <?php {MANQUE}?>
titou_doc Messages postés 4 Date d'inscription mercredi 28 mars 2007 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 21:48
------------------

{MANQUE}

test_popup.php :

<FRAMESET COLS="125,*" FRAMEBORDER="no" BORDER="0" FRAMESPACING="0">
<FRAME SRC="page1.php" name="gauche" scrolling=no>
<FRAME SRC="page2.php" name=corps>
</FRAMESET>
</FRAMESET>
-------------------

{MANQUE} = session_start();

avec ca tu devrais avoir moins de probleme
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 21:46
MALALAM, tu croit que je doit voir mon php.ini ??? car chez moi je perd les sessions dans les frames...
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 21:45
comment on enoi le session.id ? PHPSESSIONID ?? ca commence a se compliquer...

la solution de MERKHALED, c'est du bricolage, mais ca fonctionne, c'est une bonne technique qd meme ... :/
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 21:44
Chez moi cela marche.
J'ai bien "test" qui s'affiche dans ma popup dans la frame page1.php.
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 21:16
test_session.php :
<?
session_start();

#print_r($_SESSION);
$_SESSION['test']='test';

?>
test

------------------

test_popup.php :

<FRAMESET COLS="125,*" FRAMEBORDER="no" BORDER="0" FRAMESPACING="0">
<FRAME SRC="page1.php" name="gauche" scrolling=no>
<FRAME SRC="page2.php" name=corps>
</FRAMESET>
</FRAMESET>
-------------------

page1.php:

<?
session_start();
$toto=$_SESSION['test'];

echo $toto;
?>

la variable toto est vide !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 21:11
faut voir la source, mais serieux, ca ne vient pas de ca
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 21:02
j'ai oublié de le préciser dans mon post sinon dans ma page elle y est !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 20:58
t'as oublie un session_start, c'est pas possible autrement...
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 20:51
effectivement ca fonctionne si dans mon popup jet met

echo $_SESSION['test'];

mais si je met des frames :

<FRAMESET COLS="125,*" FRAMEBORDER="no" BORDER="0" FRAMESPACING="0">
<FRAME SRC="page1.php" name="gauche" scrolling=no>
<FRAME SRC="page2.php" name=corps>
</FRAMESET>
</FRAMESET>

j'ai plus accès aux sessions dans la page1.php et page2.php
:s

down ;)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 20:34
<?php
session_start();

print_r($_SESSION);
$_SESSION['test']='test';
?>
test

chez moi ca marche parfaitement...
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 20:25
en tout cas, ca marche pas chez moi, je perd la session dans le popup... et en faisant une recherche sur google, je me rend compte que je suis pas le seul a avoir ce probleme... quelqun peut me donner un exemple "fonctionnel" de passage du phpsessid ?
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 oct. 2007 à 19:21
DOWN ! (et je down si j'en ai envie... si tu veux aller par la...)

au passage, le serv ne sait pas que c'est un popup, et les sessions, c'est sur le serv, faut juste que le client renvoi le cookie, je serais etonne qu'un client ne fasse pas suivre de cookie pour les ouvertures de popups... au pire, tu gardes le phpsessid en le passant par get...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 18:37
C'est automatique sauf si tu as trifouillé ton php.ini.
Impossible que cela ne fonctionne pas sinon.
phpajax Messages postés 27 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 17 octobre 2007
8 oct. 2007 à 18:29
si si je le fait pourtant ! je pense qu'il faut passer en paramètre PHPSESSID=session.id()
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 oct. 2007 à 18:26
"après ouverture d'un popup on pert les variables sessions"
Meuh non.
Tu perds tes variables de session dans ton popup parce que tu oublies de faire un session_start() dans la page appelée par le popup, c'est tout.

Et on se calme messieurs, svp.
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
8 oct. 2007 à 18:02
>> et je up si j'ai envie, j'apprécie pas trop la manière dont tu m'as répondu ... toi qui est si intélligent

Il peut se le permettre à mon avis à la vue de ses compétences et du code que tu fournis...
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
8 oct. 2007 à 17:04
et c'est reparti pour une nouvelle polémique ...
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 17:01
si je pouvait garder la session après ouverture du popup, j'aurais pas fait ca... justement, c'est le problème, après ouverture d'un popup on pert les variables sessions !
et je up si j'ai envie, j'apprécie pas trop la manière dont tu m'as répondu ... toi qui est si intélligent ! !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
7 oct. 2007 à 13:07
ca permet juste de verifier qu'un type est passe par la bonne page, (utilise les SESSIONS pour ca, pa de requete SQL...)

quand a ton "up", t'es pas le seul a le faire, je te demande simplement d'eviter d'encombrer nos boites mails pour rien... c'est pas un procede intelligent que de dire "up" juste pour qu'on s'occupe de toi...
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
7 oct. 2007 à 00:41
"up !" ?? :)

Si j'ai bien compris l'idée, et je veux bien croire que ton code marche chez toi (sinon il ne serai pas en ligne), mais alors quel est l'intérêt de mettre un code qui ne marche pas "j'ai pas donne un code qui marche" ?
Je dit pas ca pour te descendre, mais si je suis monsieur qui débute en php et qui cherche à proteger une page, je tombe sur ton script, et je passe 3 jours à comprendre pourquoi il ne marche pas. Ou est l'intérêt ? Le but de mettre des codes, c'est pour pouvoir les réutiliser par la suite, et là ce n'est pas le cas.

Concrètement, si on veut parler de ton idée, elle n'est pas bonne sur plusieurs points. Outre les points déjà abordés (par moi et Malalam), il y a le probleme de compatibilité ; si ca ne marche que sur IE, c'est encore plus restrictif comme code. En plus, il faut que l'utilisateur ait le javascript d'activé. Ok il y en a de plus en plus, mais il reste encore des visiteurs qui ont bloqués leur javascript.

Il y a peut-être un point à travailler, mais pour le moment, c'est pas utilisable
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
7 oct. 2007 à 00:10
up!
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
6 oct. 2007 à 23:41
et meme si les uilisateurs comme ceux d'aol ont une ip qui change, ca se passe en meme pas une seconde ! le temps du lancement du poup, on enregistre l'ip avant douvrir le popup, on lance le popup et on verifie si c la meme ip, le meme code et si la clé na pa été activée ;)
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
6 oct. 2007 à 23:37
j'ai juste donné une idée, j'ai pas donne un code qui marche, celà n'empeche que ca marche très bien chez moi, je ne sait pas si tu as vraiment compris l'idée...

regarde la demo sur http://ns25643.ovh.net/ , ca ne marche que sous IE, et il faut que tu authorise les popup.

et je pari que tu pourra pas afficher des pages (qui communiquent avec la bdd) de ce site, sans passer par le popup, c'est à dire sans se logger correctement.
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
6 oct. 2007 à 23:27
le probleme c'est que certains utilisateurs (type Aol a ce qu'il parrait), ont une ip qui change aléatoirement donc ton truc est moyen pour ca.
Il faut travailler sur les sessions, c'est apparement l'une des meilleures solutions pour le moment.

Niveau 'travail sur la sécurité', il n'y a pas de rapport comme dirait Malalam.

A vrai dire il n'y a pas vraiment de sécurités complètement sures pour une protection de fichier / repertoire (outre le htaccess). Les sessions peuvent être détournée, une ip aussi, etc...

Pour ton code, il y a des choses bizarres, dans ta popup, tu utilise la variable $code et $mon_ip ainsi que la resource sql n'ont pas été crées donc si je reprends ton code comme celui que tu a donné, ca ne marchera pas.
Les codes comme celui ci sont déjà légions sur phpcs, si tu veux te faire remarquer, essaye de faire un code qui dépasse celui des autres, sinon il tombera dans le code basique et sera supprimé, ce qui est compréhensible.

Re-travaille dessus et met-le à jour, ca peux aboutir à quelque chose d'efficace.
Par contre, change de titre :p
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
6 oct. 2007 à 23:23
dans la page connect.php :
--------------------------

<SCRIPT LANGUAGE="JavaScript">

var test=top.parent.gauche;
if(!test)
{
top.window.location.replace("intru.php");

}
else
if(top.parent.gauche.document.getElementById("droit").value!="1")
{
top.window.location.replace("intru.php");
}

</script>
merkhaled Messages postés 26 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 8 octobre 2007
6 oct. 2007 à 23:21
dans le popup, j'ai une frame a gauche : menu et a droite : corps,

le frame se lance avec le passage du code en GET, je le récupère dans la frame du menu, et je verifie dans la bdd si ce code est "validé" ou pas, s'il est validé, c'est qu'il a deja été utilisé, et donc je met un et s'il na pas été activé, je met et je met a jour la bdd (jactive la clé),
dans toutes les pages, si jai besoin dune connection a la bdd, jai un include(connect.php) qui contient les infos de connections, et aussi qui vérifie si top.parent.getElementById("droit").value==1 ou sinon redirection vers intru.php ;), donc pour avoir la connection a la bdd, il faut etre dans la frame qui se lance de mon site, et avec un code de verification. jespère que j'été clair :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
6 oct. 2007 à 23:02
Hello,

ça n'a aucun rapport avec les injections SQL ton truc.
Et dans les pages à accès restreint, tu fais quoi au juste? Ton code est très incomplet, là.
En l'état, je vois mal l'avantage par rapport à une technique plus classique de session, ou de HTTP Realm.