Fonction de securité PHP/MySQL

Résolu
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

Résumé de la discussion

La fonction Secu($str,$db) applique trim, nl2br, stripslashes, htmlspecialchars et mysqli_real_escape_string; retirer cette ligne produit une chaîne vide et nourrit les inquiétudes sur l’environnement d’exécution et la connexion à la base. Des échanges indiquent que le problème vient de la connexion ($db/$bdd) ou de la portée de la variable, et recommandent de déclarer global $bdd ou de recréer la connexion pour que mysqli_real_escape_string fonctionne. Plusieurs réponses préconisent des débogages simples (print_r($str) à l'entrée et au retour) et des alertes JavaScript pour suivre les valeurs, notamment lorsque Secu est appelé avec $_POST. Autres éléments ajoutent que la configuration du serveur PHP peut influencer le comportement et que l’appel de Secu avec une connexion diffère selon que la connexion est passée ou créée.

Bobot (l’IA à votre service)
  1. 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.
    1. 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..
  2. 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) ?
    1. <?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
  3. 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.
    1. 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 ?
  4. 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.
    1. 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
    2. 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);
  5. 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.
    1. cette erreur est illogique ..
      et
      print_r($str,'*',$db);
      affiche rien
    2. Warning: print_r() expects at most 2 parameters, 3 given in H:\xampp\htdocs\fonctions.php on line 9
    3. 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
  6. 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.
    1. 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
    2. mais c'est pas normal qu'il exécute des requête sql et deux ligne plus loin ça arche plus
  7. 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.
    1. print_r($db); au début serait bien aussi.
    2. 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
    3. 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"
    4. @Utilisateur anonymeet 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
  8. 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.
    1. ca m'afiche mes info :
      string(19) "XXXXX@gmail.com" string(19) "XXXXX@gmail.com" string(6) "PASS" string(6) "PASS" 
  9. 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 !
    1. 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 ?
      1. Et ta fonction HashPass,que fait-elle,elle ?
    2. 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 ;)
      1. 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.
        1. 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 ..
        2. @Wilou017il y avais bien une erreur c'est toi même qui l'a dit entre la chaise et le clavier ;) encore merci
      2. 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é.