[mysql][faille securite]

Fermé
missb - 30 juin 2006 à 11:14
 Freko28 - 13 mai 2009 à 11:00
Bonjour
et merci d'avance

j'ai fait plusieurs scripts avec easy php et mysql pour un questionnaire.
au moment de le mettre sur le serveur, mon webmaster me dit

"Les règles primaires de sécurité ne sont clairement pas respectées (il y a de l'injection SQL possible). Ça mettra surtout en péril ta propre base de données."

mais il ne m'aide pas pour autant ...
est ce que quelqu'un pourrait me dire ce qui coince la dedans car c'est le premier script que je fais !!

je suppose, peut être à tort, que c'est dans cette partie-là


//création d'une connexion à la base de données
mysql_connect("localhost","root","");

		// sélection de la base de données news
mysql_select_db("doctorants");


	
		// création de la requête  qui va nous permettre de maj
$requete = "UPDATE suivi SET datedebcontrat='$datedebutcontrat',datefincontrat='$datefincontrat',sujet='$sujet' where identite = '$identite' ";
 
mysql_query($requete) or die("pb sql");


A moins que ce ne soit là

<?php
 
session_start();
?>
<HTML>
<HEAD><TITLE>Base de données des doctorants </TITLE>

</HEAD>
<H3 ALIGN=CENTER>

FIN D’ACTIVITE DES DOCTORANTS  <BR>
Questionnaire 2006<BR>

-

PROMOTION 2005</H3>


<?php


 


// récupération du nom saisi dans le formulaire , on le met en maj comme dans la base
$nom=$_REQUEST["nom"];

$prenom=$_REQUEST["prenom"];
$nom=strtoupper($nom);
// récupération du prenom saisi dans le formulaire,on le met en minuscule, on met la 1ere lettre en maj comme dans la base

$prenom=strtolower($prenom);
$prenom=ucfirst($prenom);

// si les champs sont vides on refuse

if ($nom==""&&$prenom=="")
	{
	echo "<TR><TD COLSPAN=5>Vous devez saisir votre nom et prénom : acces refusé</TD></TR>";

	}
else 
	{



// création d'une connexion à la base de données


mysql_connect("localhost","root","");

// sélection de la base de données formation
mysql_select_db("doctorants");




// création de la requête  qui va nous permettre de récupérer les infos sur le doctorant
$requete = "SELECT * FROM suivi where identite = '$nom $prenom' ";

// fait le lien entre identite et identifiant


// execution de la requête
$resultats = mysql_query($requete)or die (" probleme sql");

// parcours des résulats : tant qu'il y a des resultats : afficher
while($ligne = mysql_fetch_array($resultats)) {
	
              


// récupération des champs	

$identite= $ligne["identite"];	
$pays = $ligne["pays"];	
$genre = $ligne["genre"];	
$annee = $ligne["annee"];	
$equipe = $ligne["equipe"];			
	 


// affichage du tableau

// si le nom saisi dans le formulaire est le même que celui récupéré de la base de données afficher liste

	// affichage d'une ligne du tableau
		 


			// affichage du nom
			echo "Nom et prénom du doctorant: $identite<br>";
			
			// affichage du pays
			echo "Pays : $pays<br>";
			
			// affichage du sexe
			echo "Sexe : $genre<br>";
			
			// affichage annee naissance
			echo "Année de naissance : $annee<br>";
			// affichage de l'equipe
			echo "Equipe/projet de recherche : $equipe<br>";
		
	
						



$_SESSION["identite"]=$identite;
$_SESSION["pays"]=$pays;
$_SESSION["genre"]=$genre;
$_SESSION["annee"]=$annee;
$_SESSION["equipe"]=$equipe;
include 'questionnaire.php';
}
// si le login saisi dans le formulaire  n'est pas dans la base

if (mysql_num_rows($resultats)==0)

{
echo "<TR><TD COLSPAN=5>Erreur de login : acces refusé</TD></TR>";

}
}
?>
</table>

</HTML>
A voir également:

5 réponses

Bon j'éclaire les choses :

COncernant : elghafoud, ce n'est pas l'abcense de mot de passes qui va permettre les injections SQL.

Oui, il faut mettre un mot de passe à ton serveur SQL car sinon n'importe qui peux se connecter à ton serveur pour changer le contenu des tables et etc. (A part si tu as une restriction d'IP).

Ensuite, pour ne plus être vulnérable à l'SQL injection, il y a juste à activer les magic_quotes dans ton fichier PHP.ini, de même pour plus de sécurité, (même si cela n'a rien a voir avec l'SQL injection) active le Safe_mod.


Voilà :D
1
Bonjour à Tous

Voici le code corrigé (enfin les principals failles)

<?php

session_start();
?>
<HTML>
<HEAD><TITLE>Base de données des doctorants </TITLE>

</HEAD>
<H3 ALIGN=CENTER>

FIN D’ACTIVITE DES DOCTORANTS <BR>
Questionnaire 2006<BR>

-

PROMOTION 2005</H3>


<?php

//Fonction de securisation des variable pour les utiliser dans une requete utilisation :
//Sur une variable de type str $var = Secure_SQL($var, 2);
//Sur une variable de type int $var = Secure_SQL($var, 1); retourne 0 en cas derreur
function Secure_SQL($var, $id) {
if $id == 1 {
if (is_int(23)) {
return $var;
}
else {
return 0;
}
}
else {
if(get_magic_quotes_gpc()) {
return addslashes($var);
}
}
}

//Fonction de securisation des variable contre les failles xss
function Secure_Xss($var) {
return strip_tags(htmlentities ($var));
}


// récupération du nom saisi dans le formulaire , on le met en maj comme dans la base
$nom=$_REQUEST["nom"];

$prenom=$_REQUEST["prenom"];
$nom=strtoupper($nom);
// récupération du prenom saisi dans le formulaire,on le met en minuscule, on met la 1ere lettre en maj comme dans la base

$prenom=strtolower($prenom);
$prenom=ucfirst($prenom);

// si les champs sont vides on refuse

if ($nom==""&&$prenom=="")
{
echo "<TR><TD COLSPAN=5>Vous devez saisir votre nom et prénom : acces refusé</TD></TR>";

}
else
{



// création d'une connexion à la base de données


mysql_connect("localhost","root","");

// sélection de la base de données formation
mysql_select_db("doctorants");
$nom = Secure_SQL($nom,2)
$prenom = Secure_SQL($prenom,2)



// création de la requête qui va nous permettre de récupérer les infos sur le doctorant
$requete = "SELECT * FROM suivi where identite = '$nom $prenom' ";

// fait le lien entre identite et identifiant


// execution de la requête
$resultats = mysql_query($requete)or die (" probleme sql");

// parcours des résulats : tant qu'il y a des resultats : afficher
while($ligne = mysql_fetch_array($resultats)) {




// récupération des champs

$identite= Secure_Xss($ligne["identite"]);
$pays = Secure_Xss($ligne["pays"]);
$genre = Secure_Xss($ligne["genre"]);
$annee = Secure_Xss($ligne["annee"]);
$equipe = Secure_Xss($ligne["equipe"]);



// affichage du tableau

// si le nom saisi dans le formulaire est le même que celui récupéré de la base de données afficher liste

// affichage d'une ligne du tableau



// affichage du nom
echo "Nom et prénom du doctorant: $identite<br>";

// affichage du pays
echo "Pays : $pays<br>";

// affichage du sexe
echo "Sexe : $genre<br>";

// affichage annee naissance
echo "Année de naissance : $annee<br>";
// affichage de l'equipe
echo "Equipe/projet de recherche : $equipe<br>";






$_SESSION["identite"]=$identite;
$_SESSION["pays"]=$pays;
$_SESSION["genre"]=$genre;
$_SESSION["annee"]=$annee;
$_SESSION["equipe"]=$equipe;
include 'questionnaire.php';
}
// si le login saisi dans le formulaire n'est pas dans la base

if (mysql_num_rows($resultats)==0)

{
echo "<TR><TD COLSPAN=5>Erreur de login : acces refusé</TD></TR>";

}
}
?>
</table>

</HTML>
0
Freko28 > Freko28
13 mai 2009 à 10:46
Pour ton update tu peu faire aussi :

//création d'une connexion à la base de données
mysql_connect("localhost","root","");

// sélection de la base de données news
mysql_select_db("doctorants");



// création de la requête qui va nous permettre de maj
$requete = "UPDATE suivi SET datedebcontrat='Secure_SQL($datedebutcontrat,2)',datefincontrat='Secure_SQL($datefincontrat,2)',sujet='Secure_SQL($sujet,2)' where identite = 'Secure_SQL($identite,2)' ";

mysql_query($requete) or die("pb sql");


Donc maintenant, A CHAQUE FOIS QUE TU UTILISE UNE VARIABLE DANS UNE REQUETE, IL FAUT LA VERIFIER/PROTEGER...
Un autre principe de base en secu informatique : Ne jamai faire confiance aux données transmisent par l'utilisateur
0
Freko28 > Freko28
13 mai 2009 à 10:50
Bon je n'ai pas trouver de bouton edit donc je rajoute un 3ème post pour signaler une petite erreure dans le premier code :


function Secure_SQL($var, $id) {
if ($id == 1) {
if (is_numeric($var) && $var >=0) {
return $var;
}
else {
return 0;
}
}
else {
if(get_magic_quotes_gpc()) {
return addslashes($var);
}
}
}



Encors désolé pour l'enchainement de post
0
Freko28 > Freko28
13 mai 2009 à 11:00
Bon dernière edition sans erreur cette fois :

Bonjour à Tous

Voici le code corrigé (enfin les principals failles)


<?php

session_start();
?>
<HTML>
<HEAD><TITLE>Base de données des doctorants </TITLE>

</HEAD>
<H3 ALIGN=CENTER>

FIN D’ACTIVITE DES DOCTORANTS <BR>
Questionnaire 2006<BR>

-

PROMOTION 2005</H3>


<?php

//Fonction de securisation des variable pour les utiliser dans une requete utilisation :
//Sur une variable de type str $var = Secure_SQL($var, 2);
//Sur une variable de type int $var = Secure_SQL($var, 1); retourne 0 en cas derreur
function Secure_SQL($var, $id) {
if ($id == 1) {
if (is_numeric($var) && $var >=0) {
return $var;
}
else {
return 0;
}
}
else {
if(!get_magic_quotes_gpc()) {
return addslashes($var);
}
}
}


//Fonction de securisation des variable contre les failles xss
function Secure_Xss($var) {
return strip_tags(htmlentities ($var));
}


// récupération du nom saisi dans le formulaire , on le met en maj comme dans la base
$nom=$_REQUEST["nom"];

$prenom=$_REQUEST["prenom"];
$nom=strtoupper($nom);
// récupération du prenom saisi dans le formulaire,on le met en minuscule, on met la 1ere lettre en maj comme dans la base

$prenom=strtolower($prenom);
$prenom=ucfirst($prenom);

// si les champs sont vides on refuse

if ($nom==""&&$prenom=="")
{
echo "<TR><TD COLSPAN=5>Vous devez saisir votre nom et prénom : acces refusé</TD></TR>";

}
else
{



// création d'une connexion à la base de données


mysql_connect("localhost","root","");

// sélection de la base de données formation
mysql_select_db("doctorants");
$nom = Secure_SQL($nom,2)
$prenom = Secure_SQL($prenom,2)



// création de la requête qui va nous permettre de récupérer les infos sur le doctorant
$requete = "SELECT * FROM suivi where identite = '$nom $prenom' ";

// fait le lien entre identite et identifiant


// execution de la requête
$resultats = mysql_query($requete)or die (" probleme sql");

// parcours des résulats : tant qu'il y a des resultats : afficher
while($ligne = mysql_fetch_array($resultats)) {




// récupération des champs

$identite= Secure_Xss($ligne["identite"]);
$pays = Secure_Xss($ligne["pays"]);
$genre = Secure_Xss($ligne["genre"]);
$annee = Secure_Xss($ligne["annee"]);
$equipe = Secure_Xss($ligne["equipe"]);



// affichage du tableau

// si le nom saisi dans le formulaire est le même que celui récupéré de la base de données afficher liste

// affichage d'une ligne du tableau



// affichage du nom
echo "Nom et prénom du doctorant: $identite<br>";

// affichage du pays
echo "Pays : $pays<br>";

// affichage du sexe
echo "Sexe : $genre<br>";

// affichage annee naissance
echo "Année de naissance : $annee<br>";
// affichage de l'equipe
echo "Equipe/projet de recherche : $equipe<br>";






$_SESSION["identite"]=$identite;
$_SESSION["pays"]=$pays;
$_SESSION["genre"]=$genre;
$_SESSION["annee"]=$annee;
$_SESSION["equipe"]=$equipe;
include 'questionnaire.php';
}
// si le login saisi dans le formulaire n'est pas dans la base

if (mysql_num_rows($resultats)==0)

{
echo "<TR><TD COLSPAN=5>Erreur de login : acces refusé</TD></TR>";

}
}
?>
</table>

</HTML>




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


Pour ton update tu peu faire :


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


//création d'une connexion à la base de données
mysql_connect("localhost","root","");

// sélection de la base de données news
mysql_select_db("doctorants");



// création de la requête qui va nous permettre de maj
$requete = "UPDATE suivi SET datedebcontrat='Secure_SQL($datedebutcontrat,2)',datefincontrat='Secure_SQL($datefincontrat,2)',sujet='Secure_SQL($sujet,2)' where identite = 'Secure_SQL($identite,2)' ";

mysql_query($requete) or die("pb sql");


Donc maintenant, A CHAQUE FOIS QUE TU UTILISE UNE VARIABLE DANS UNE REQUETE, IL FAUT LA VERIFIER/PROTEGER...
Un autre principe de base en secu informatique : Ne jamai faire confiance aux données transmisent par l'utilisateur



Encors désolé pour l'enchainement de post si un modo pouvais virer mes précedent post ça serai sympa :)
0
elghafoud Messages postés 121 Date d'inscription jeudi 20 février 2003 Statut Membre Dernière intervention 29 avril 2013 18
30 juin 2006 à 13:19
tout simplement parce que roor n'a pas de mot de passe !!! et c'est tres tres tres grave! essaye de mettre un !
sinon essaye aussi de creer des utilisateur avec des droit limite!

courage
0
oh, merci
mais le truc c'est que les utilisateurs doivent pouvoir modifier la base, mais juste leur ligne.
alors, même si je leur donne un mot de passe, comment faire pour qu'ils ne touchent pas aux autres lignes ?
-1
BARBOIN Jean
8 juin 2007 à 17:15
lalala tu dis n'importe quoi il faut pas mettre de mot de passe pour que se soit BEAUCOUP MIEUX SECURISE je l'ai fait plein de fois et je peux te dire que je n'ai eu aucun probleme au contraire: on m'avait dis qu'il fallais absolument un mot de passe et du jour au lendemain, mon site a disparu je ne sais comment et après je n'ai pas mis de mot de passe et tout allais mieux, j'avais perdu toutes mes données et j'ai remis 6 mois a tout bien refaire... Donc un conseil: ne met jamais de mot de passe a ton serveur MySQL
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mets un grand coup de boule à ton webmaster et il t'expliquera tout ça.
Pour ce qui est de root, cela me semble vrai en local host, mais ne compte tu pas mettre en ligne ton site, donc ton hebergeur va te fournir d'autres codes ?
-1