8797 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour tout le monde,

En testant une faille de sécurité (injection sql), j'ai réalisé un petit code pour voir comment réagi la requête face à une injection.

ma table


CREATE TABLE `ma_table` (
  `id_admin` int(10) unsigned NOT NULL auto_increment,
  `login_admin` varchar(20) NOT NULL,
  `mdp_admin` varchar(8) NOT NULL,
  PRIMARY KEY  (`id_admin`)
)


mon code :

<?php
require_once("../include/connect.php");



$connect=connect(HOTE,UTIL,MDP,BDD);

function verif_bdd($connect){

	$table="ma_table";
	
	$nom=htmlspecialchars($_POST["nom"]);
	$pass=htmlspecialchars($_POST["pass"]);

	
	$faux_nom="' OR ''='";
	$faux_pass="' OR ''='";
	
	$sql="SELECT login_admin,mdp_admin ";
	$sql.="FROM ".$table." ";
	$sql.="WHERE login_admin='".$_POST["nom"]."' AND mdp_admin='".$_POST["pass"].$faux_pass."'";
	$resultat=exec_sql($sql,$connect);
	
	$data=mysql_fetch_assoc($resultat);
	
	if($data["login_admin"]!=$_POST["nom"] || $data["mdp_admin"]!=$_POST["pass"]){
		echo "ko<hr />";
		echo $_POST["nom"]." - ".$_POST["pass"]."<hr />";
		echo $sql;
	}else{
		echo "connexion au compte : ok !";
	}
	
}
function form_login(){
?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
            <title>Document sans titre</title>
        </head>
        
        <body>
            <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post" name="login">
                <p><label>nom : </label><input type="text" name="nom" value="" /></p>
                <p><label>pass : </label><input type="password" name="pass" value="" /><input type="hidden" name="_verif_envoi" value="ok" /></p>
                <p><input type="submit" name="envoyer" value="vas y" /></p>
            </form>
        </body>
    </html>
<?php
}



if(!empty($_POST["nom"]) && !empty($_POST["pass"])){
	verif_bdd($connect);
}else{
	form_login();
}
?>


Ma question est simple : je sais que la solution est de filtrer les super-globales notamment avec mysql_real_escape_string() et autres fonctions. Mais en testant mon script (sans le filtrage) cela fonctionne assez bien.

J'ai beau cherché, je n'ai pas pu me connecter à la bdd sans le login et le pass.

Merci de me démontrer explicitement une faille.

++ et bonne soirée.

PS : Comme je m'intéresse un peu plus sur la sécurité et PHP, pouvez vous me dire si ce livre est intéressant. Est ce que quelqu'un l'a lu ?
Modifié par Nolem (20 Sep 2008 - 21:44)
Salut,

Si j'ai bien compris tu veux "en gros" savoir si ton code est bien sécurisé par rapport au injection SQL ?
Hello Nolem,

ben je ne vois aucun intérêt à ne pas utiliser mysql_real_escape_string. Smiley rolleyes

D'abord parce qu'il est facile de faire planter ton code (par exemple avec login = a' / mdp = a). Ensuite parce que ça t'oblige à faire un test inutile après avoir trouvé un résultat...
salut à tous

nolem a écrit :

PS : Comme je m'intéresse un peu plus sur la sécurité et PHP, pouvez vous me dire si ce livre est intéressant. Est ce que quelqu'un l'a lu ?

non ... Smiley biggrin
mais comme je suis à fond concernant les php et la sécurité je recommande
Guide to security (en) vraiment très bien fait

Sinon pour tout ceux que la sécurité de leurs applications intéressent Smiley biggol
c'est presque obligatoire de lire php-security-guide (format pdf) , une excellente introduction à un sujet fort "à la mode" il semble Smiley cligne

ps : concernant ton code pas trop le temps de m'y plonger plus que cela ... on verra au boulot Smiley lol

Au sujet de ton bouquin et vu la la carte de visite d'un des auteurs , ce doit être pas mal !!!
Modifié par kzone (16 Sep 2008 - 23:51)
Modérateur
a écrit :

D'abord parce qu'il est facile de faire planter ton code (par exemple avec login = a' / mdp = a). Ensuite parce que ça t'oblige à faire un test inutile après avoir trouvé un résultat...


Salut Heyoan et Kzone,

* Heyoan : Le but de ce petit script est que je le teste sur les différentes possibilités pour le faire planter et faire apparaître des informations qui ne doivent pas transpirer normalement. J'ai même fait une grosse bourde sur la sécurité Smiley confused .

Là, je suis en train de préparer une class (journal_erreur) afin de répertorier/traquer des types d'erreurs. J'ai regardé les fichiers log de WAMP, ils me disent pas grand chose lors d'un plantage d'une requête ou problème liés à la sécurité de la bdd et PHP.

En ce moment, je me préoccupe plus des problèmes de sécurité qu'une amélioration de ma syntaxe du langage. Quoique ...

* Kzone : Je te remercie de tes liens. Malheureusement, je suis pas un grand féru de l'Anglais. Néanmoins, je vais essayer de m'atteler sur le *.pdf qui me parait fort intéressant.
Je n'avais pas vu la carte de visite de l'auteur. Décidément, je n'arrive pas à choisir quel livre je vais acheter en premier. l'épaisseur de mon chevet ou de mon bureau commence à être mince et il faut que je le comble par de la bonne lecture Smiley smile .

<<<HS
À propos de la gestion des erreurs, est ce que vous utilisez try/throw/catch ou vous faites votre propre cuisine ?
Pour ma part, je fais ma propre cuisine. Ai-je tort ?
HS;

++ et bonne soirée à vous Smiley smile
Modifié par Nolem (17 Sep 2008 - 22:13)
Je suis plutot partisan d'utiliser les outils fournis par le langage en général
et la gestion des erreurs try/catch est vraiment un bonne chose depuis php5

Les programmeurs java ne sont pas dépaysés Smiley ravi !

de plus les erreurs deviennent facile à gérer et ne te font pas sortir d'une fonction en cas d'erreur mais "attrape" bien l'erreur et la traite dans le catch.

a titre d'information le pdf est ce qui est en partie "repris" dans le zend php certification qui traite lui aussi en profondeur la sécurité (autre excelent bouquin sur le php .. en anglais aussi Smiley cligne )

a écrit :

Là, je suis en train de préparer une class (journal_erreur) afin de répertorier/traquer des types d'erreurs. J'ai regardé les fichiers log de WAMP, ils me disent pas grand chose lors d'un plantage d'une requête ou problème liés à la sécurité de la bdd et PHP.


tu peux tracer les erreurs en utilisant set_ini de php pour les
error_reporting
Modifié par kzone (18 Sep 2008 - 17:09)
Modérateur
kzone a écrit :


de plus les erreurs deviennent facile à gérer et ne te font pas sortir d'une fonction en cas d'erreur mais "attrape" bien l'erreur et la traite dans le catch.

...

tu peux tracer les erreurs en utilisant set_ini de php pour les
error_reporting


Salut Kzone,

Je croyais que lorsqu'il y avait une erreur avec try/throw/catch la fonction s'interrompait et aller directement à l'Exception. Smiley confused Dernièrement, j'utilisais plus un sytème de base géré comme php4 (if elseif else ...) . Prochaienement, j'ai un petit projet que je compte bien mettre en place et en fait je souhaite implémenter un système plus performant et plus robuste que ceux que j'ai fait auparavant.

En ce qui concerne le error_reporting, tu fais bien de me conseiller de regarder. De mémoire, il me semble que je suis en E_ALL. Là, je ne suis pas sur ma machine. Je ne peux pas vérifier de suite. En rentrant, je vais voir cela de plus près. Si je ne dis pas de bêtise, on peut regarder à l'aide du phpinfo() et le fichier php.ini, n'est ce pas ?

Bonne soirée à toi
Modifié par Nolem (18 Sep 2008 - 19:24)
pour mes développement je ne modifie pas le .ini bien sûr et je mets en début de script

error_reporting (E_ALL);
ini_set('display_errors','true');


ce qui me donne une assez jolie trace de mes erreurs Smiley lol
upload/8937-error.png

concernant try/catch tu me mets un peu le doute et ce que je lis dans php5 avancé me dise carrément le contraire : le code du bloc try s'exécute et si une exception est levée PHP arrête son exécution et interprète celui de catch()
Smiley ohwell
[diffère un rien des exceptions Java]
Faut que je relise attentivement cela moi Smiley biggol ...avant de dire des c.....es !

++
kzone a écrit :

[diffère un rien des exceptions Java]
Euh... ben non c'est pareil : les exceptions PHP.

D'ailleurs d'après ce que j'en comprends c'est la même chose pour Javascript... Smiley murf
Modifié par Heyoan (18 Sep 2008 - 21:30)
... bon je me replonge dans mes bouquin et mes tests Smiley rolleyes
désolé pour la désinformation Smiley confused

par contre cela peut-être intéressant de se mettre au "test unitaire" avec simpletest ou bien phpunit pour tester ton code avant d'y penser à la fin ..
Modérateur
kzone a écrit :

désolé pour la désinformation Smiley confused


Ce n'est pas grave Smiley smile . Cela arrive de faire des petites erreurs. Je te remercie des petits liens que tu m'as donnés. Smiley smile

++