Fonction de securité PHP/MySQL

Résolu/Fermé
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 - Modifié par Wilou017 le 8/02/2015 à 21:26
 Utilisateur anonyme - 9 févr. 2015 à 01:01
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 !
A voir également:

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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 8/02/2015 à 21:38
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..
0
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) ?
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 8/02/2015 à 23:22
<?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
0
Utilisateur anonyme
8 févr. 2015 à 22:47
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 22:51
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 ?
0
Utilisateur anonyme
8 févr. 2015 à 23:05
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 8/02/2015 à 23:22
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
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 23:22
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);
0

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

Posez votre question
Utilisateur anonyme
8 févr. 2015 à 23:41
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 23:43
cette erreur est illogique ..
et
print_r($str,'*',$db);
affiche rien
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 23:47
Warning: print_r() expects at most 2 parameters, 3 given in H:\xampp\htdocs\fonctions.php on line 9
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 23:52
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
0
Utilisateur anonyme
8 févr. 2015 à 23:53
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
8 févr. 2015 à 23:56
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
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
9 févr. 2015 à 00:02
mais c'est pas normal qu'il exécute des requête sql et deux ligne plus loin ça arche plus
0
Utilisateur anonyme
9 févr. 2015 à 00:02
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.
0
Utilisateur anonyme
9 févr. 2015 à 00:06
print_r($db); au début serait bien aussi.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11 > Utilisateur anonyme
Modifié par Wilou017 le 9/02/2015 à 00:19
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
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 9/02/2015 à 00:10
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
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 9/02/2015 à 00:14
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"
0
Utilisateur anonyme
9 févr. 2015 à 00:18
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
9 févr. 2015 à 00:22
ca m'afiche mes info :
string(19) "XXXXX@gmail.com" string(19) "XXXXX@gmail.com" string(6) "PASS" string(6) "PASS" 
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
9 févr. 2015 à 00:28
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 !
0
Utilisateur anonyme
9 févr. 2015 à 00:32
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 ?
0
Utilisateur anonyme
9 févr. 2015 à 00:34
Et ta fonction HashPass,que fait-elle,elle ?
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
Modifié par Wilou017 le 9/02/2015 à 00:33
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 ;)
0
Utilisateur anonyme
9 févr. 2015 à 00:41
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.
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11
9 févr. 2015 à 00:42
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 ..
0
Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015 11 > Wilou017 Messages postés 54 Date d'inscription jeudi 12 juillet 2012 Statut Membre Dernière intervention 21 avril 2015
Modifié par Wilou017 le 9/02/2015 à 00:46
il y avais bien une erreur c'est toi même qui l'a dit entre la chaise et le clavier ;) encore merci
0
Utilisateur anonyme
9 févr. 2015 à 01:01
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é.
0