Fonction de securité PHP/MySQL [Résolu/Fermé]

Signaler
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
-
 Utilisateur anonyme -
Bonjour,

j'ai cette fontion :

function Secu($str,$db)
{
$str = trim($str);
$str = nl2br($str);
$str = stripslashes($str);
$str = htmlspecialchars($str);
$str = mysqli_real_escape_string($db, $str);
return $str;
}


appelé comme ceci : Secu([CHAINE DE CARACTÈRE],$bdd);
sans cette ligne :
$str = mysqli_real_escape_string($db, $str);

ca marche bien mais il me la faut et il me renvoie une chaine vide !

13 réponses

Bonjour

appelé comme ceci : Secu([CHAINE DE CARACTÈRE],$bdd);
Non, si tu l'appelles comme ceci, tu as droit à Parse error: syntax error, unexpected 'DE' (T_STRING), expecting ']' parce que ton écriture [CHAINE DE CARACTÈRE] est totalement incorrecte.
Si tu l'appelles avec une vraie chaîne et que tu masques les "warning", ça peut venir d'un problème de connexion à la base qui empêche le mysqli_real_escape_string de bien fonctionner. Essaye dans un premier temps de mettre la ligne du mysqli_real_escape_string en commentaire pour voir.

Au passage, même si ça n'a pas de rapport direct avec ton problème, ta fonction est une horreur. On a vraiment l'impression que, n'ayant pas vraiment compris à quoi servent ces fonctions, tu les as toutes mises dans un grand fourre-tout en espérant t'éviter des problèmes, ce qui est en partie vrai, mais sans te rendre compte que tu vas toi-même corrompre tes données par toutes ces fonction utilisées à mauvais escient.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
Merci de ta réponse cette fonction sert juste a éviter que les gens mettes n'importe quoi dans les champ comme pseudo et mot de passe donc elle me vas assez bien ^^

ensuite je l'ai déjà mise en commentaire et la fonction marche bien et elle marche même quand j'utilise
$str = mysql_real_escape_string($str);

au lieu de
$str = mysqli_real_escape_string($db, $str);


et puis quand je l'appel je l'appel comme ca :
$mail=Secu($_POST["mail"], $bdd);

donc ca ne pose pas de problème

mais c'est bizarre que ce marche avec mysql_real_escape_string() et pas avec la fonction mysqli alors que tout mon site est fait avec mysqli..
Je sais bien que cette fonction sert à te protéger des gens qui mettent n'importe quoi, je dis juste que tu t'en protèges en faisant autant n'importe quoi qu'eux. Mais ça n'explique pas ton problème.
C'est absolument anormal que ça ne marche pas avec mysqli_real_escape_string. C'est certainement que le $bdd que tu passes n'est pas un bon lien retourné par un mysqli_connect. Peut-on voir ton code de connexion (en cachant tes identifiants, bien sûr) ?
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
<?php
define('URL','http://site.wilou/'); // URL du site
define('DB_HOST','localhost'); // Host de la base de donnée
define('DB_USER','root');// nom d'utilisateur de la base de donnée
define('DB_PASS','MDP');// mot de passe de l'utilisateur
define('DB_NAME','DBNAME'); // nom de la base de donnée
define('DB_PORT','3306'); // port de la base de donnée
 
$bdd=mysqli_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASS,DB_NAME);// connexion a la base de donnée
if (mysqli_connect_errno()) {
    printf("Echec de la connexion : %s\n", mysqli_connect_error());
    exit();
}
 ?>


utiliser le MySQLi c'est tout nouveau pour moi je suis plutôt a l'ancienne :l

Ta connexion est correcte et chez moi ton code marche, y compris la fonction secu.
L'endroit d'où tu appelles
$mail=Secu($_POST["mail"], $bdd);
est-il lui-même à l'intérieur d'une fonction ? Si c'est le cas, il ne faut pas oublier de déclarer global $bdd; au début de ta fonction, sinon la variable $bdd est inconnue.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
ouai je sais mais non il est pas dans une fonction logiquement ça devrais marcher .. ça doit surement venir de mon serveur php
quelle version de php utilise tu ?

Elles ont bon dos, les versions des logiciels, quand on ne comprend pas ce qui se passe. Si la connexion a bien lieu, c'est que mysqli n'a pas de problèmes.
Ta connexion n'as pas elle-même lieu dans une fonction ? On aurait le même problème de la globalité de $bdd.

Pour vérifier ça, ajoute donc ;
print_r($str,'*',$db);

au début de ta fonction Secu

Ma version de PHP c'est 5.4.3 mais ça n'a aucun rapport.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
avent e faire ce que tu propose je tien a augmenter le WTF du sujet c'est que j'ai une autre fonction mais elle elle marche:
 function UserByID($id,$nom,$prenom,$db)
  {
   $userbyid=mysqli_fetch_assoc(mysqli_query($db,"SELECT prenom,nom FROM user WHERE id='".$id."' LIMIT 1"));
   $return = "";
   if($nom==1){
    $return .= $userbyid['nom']." ";
   }
   if($prenom==1){
    $return .= $userbyid['prenom'];
   }
   
   return $return;
  }

donc il arrive bien a recupéré le $db
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
la fonction comme ca fonctione bien ..

	function Secu($str)
		{
			$bdd=mysqli_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASS,DB_NAME);
			$str = trim($str);
			$str = nl2br($str);
			$str = stripslashes($str);
			$str = htmlspecialchars($str);
			$str = mysqli_real_escape_string($bdd, $str);
			return $str;
		}


j'ai rajouté
$bdd=mysqli_connect(DB_HOST.":".DB_PORT,DB_USER,DB_PASS,DB_NAME);

Ton problème n'est pas résolu ! Tu as fait n'importe quoi et tu continues. Tu contournes les erreurs au lieu de les comprendre et de les corriger, tu n'iras pas loin avec cette méthode.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
cette erreur est illogique ..
et
print_r($str,'*',$db);
affiche rien
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
Warning: print_r() expects at most 2 parameters, 3 given in H:\xampp\htdocs\fonctions.php on line 9
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
j'ai ajouter une requete sql voir ce que ca faisais:

	function Secu($str, $db)
		{
			mysqli_query($db,"UPDATE `user` SET `ip_last` = 'TEST' WHERE `id` =1");
			$str = trim($str);
			$str = nl2br($str);
			$str = stripslashes($str);
			$str = htmlspecialchars($str);
			$str = mysqli_real_escape_string($db, $str);
			return $str;
		}


elle est parfaitement exécuté, j'ai vérifié dans la base de donné:
https://prnt.sc/62s3nk

cette erreur est illogique Ça ne veut rien dire, une erreur a TOUJOURS une bonne raison d'être. Et tu sais bien qu'elle trouve son origine le plus souvent entre la chaise et le clavier.
print_r($str.'*'.$db);
des . au lieu des , j'espère que tu as corrigé de toi-même.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
je bloque sur ma page de traitement avec une belle erreur https://prnt.sc/62s59o

non j'utilise pas de print() en php donc j'ai pas fait gaffe
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
mais c'est pas normal qu'il exécute des requête sql et deux ligne plus loin ça arche plus

Moi non plus je ne l'utilise pas souvent, la preuve ^^
En tous cas, on sait que c'est $db est un objet mysqli, ce qui est déjà bien.
Maintenant, print_r($str) seulement. Une fois au début de la fonction et une fois juste avant le return.
Utilisateur anonyme
print_r($db); au début serait bien aussi.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11 > Utilisateur anonyme
et si on essaye d'affiche de quelconque facon que ce soit $db ca fait
Catchable fatal error: Object of class mysqli could not be converted to string in H:\xampp\htdocs\fonctions.php on line 9
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
print_r($str)
affiche rien alors j'ai fait
echo "<script> alert ('$str') </script>";
et j'ai deux alerte par champ avec ce que j'ai entré dans mon login et mon mot de passe ce qui est encore plus bizarre ! vue qu'il me dt qu'un de mes champ est vide ! alors que les 4 alerte affiche quelque chose
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
en gros ca fait ca :
 
 function Secu($str, $db, $blbl)
  {
   echo "<script> alert ('$str') </script>";
   $str = trim($str);
   $str = nl2br($str);
   $str = stripslashes($str);
   $str = htmlspecialchars($str);
   $str = mysqli_real_escape_string($db, $str);
   echo "<script> alert ('$str') </script>";
   if($blbl==1)
   exit;
   return $str;
  }

j'ai mit un exit si non on vois pas les alerte
$mail=Secu($_POST["mail"], $bdd,0); 
 $password = HashPass(Secu($_POST['password'], $bdd,1));


 if(isset($mail) && isset($password) && $mail!="" && $password!="")
 {
[...]
 } else {
  $_SESSION['message_login']="Merci de remplir tous les champs";
  header("Location: ".URL); 
  exit;
 }


et il m'affiche bien mon erreur "Merci de remplir tous les champs"

Ce n'était pas une très bonne idée de te suggérer print_r, on obtient plus de renseignements avec var_dump.
var_dump($str) au début de Secu, et une autre fois juste avant le return.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
ca m'afiche mes info :
string(19) "XXXXX@gmail.com" string(19) "XXXXX@gmail.com" string(6) "PASS" string(6) "PASS" 
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
OKAY j'ai trouver le problème x) et je l'ai reglé ca a l'aire de marché, je verifie et je te dit !

Secu ne te renvoie pas une chaîne vide. Depuis 3h1/2 je cherche pourquoi ta fonction renvoie une chaîne vide alors que c'est faux, elle ne renvoie pas de chaîne vide.
Pourquoi dis-tu dans ton premier message que ta fonction renvoie une chaîne vide ?
Utilisateur anonyme
Et ta fonction HashPass,que fait-elle,elle ?
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
ALORS!!!

en fait je recupere les champ comme ca :
$mail=Secu($_POST["mail"], $bdd); // on ce connecte via son email c'est mieux
 $password = HashPass(Secu($_POST['password'], $bdd));


je truc c'est que ma fonction HashPass() utilise la fonction Secu() et elle avais pas le second parametre tel que :
$password = HashPass(Secu($_POST['password'], $bdd),$bdd);


mais en soit mysqli_real_escape_string() sert a rien pour le hashage donc fait refait ma fonction HashPass tel que :
 function HashPass($str)
  {
   $config_hash = "MA_CLE";
   $str = trim($str);
   $str = nl2br($str);
   $str = stripslashes($str);
   $str = htmlspecialchars($str);
   $str = hash($str . $config_hash);
   return $str;
  }


donc voila ça marche Merci de m'avoir aider et m'avoir a comprendre d'où ça venais ;)

Et moi, je ne te remercie pas de m'avoir fait chercher une erreur qui n'existait pas. Tu disais que ta fonction Secu rendait une chaîne vide alors que c'était faux. 3h là-dessus.
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11
pas encore l'habitude d'envoyer des $bdd a tout vas pour le mysqli
pourquoi il ont pas laisser c'était très bien avent ..
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015
11 >
Messages postés
54
Date d'inscription
jeudi 12 juillet 2012
Statut
Membre
Dernière intervention
21 avril 2015

il y avais bien une erreur c'est toi même qui l'a dit entre la chaise et le clavier ;) encore merci

Le problème ce n'est pas que tu te trompes en programmation, ça n'est pas grave, il faut bien apprendre.

Le problème, c'est que tu donnes de faux renseignements sur tes problèmes. Tu disais que ta fonction te renvoyait une chaîne vide, alors que c'est faux. Ta fonction Secu ne renvoyait pas de chaîne vide, tu ne l'avais même pas vérifié.