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
mon code :
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)
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)