Insert To probleme

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Insert To probleme

Re: Insert To probleme

par xTG » 22 janv. 2012, 10:31

La fonction quote est à utiliser pour toute requête qui ne passe pas par un prepare() (requête préparée, mais aucune utilité dans tes cas).
Elle ne fait pas que détecter les types de variable pour rajouter ou non des quotes, elle protège aussi les caractères spéciaux qui pourrait faire échouer la requête ou la modifier.

Re: Insert To probleme

par demonjhpn » 21 janv. 2012, 21:40

;p ok super !

autre chose

est ce que je dois securiser egalement une requete fetch ?
<?php
session_start();
 

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);
    


$loginOK = false;  // cf Astuce
      

// On n'effectue les traitement qu'à la condition que 
// les informations aient été effectivement postées
if ( isset($_POST) && (!empty($_POST['login'])) && (!empty($_POST['password'])) )
{
    extract($_POST);  // je vous renvoie à la doc de cette fonction
  
    $login_echap = $bdd->quote($_POST['password']);
    echo $login_echap;

      // On va chercher le mot de passe afférent à ce login
    $sql = "SELECT nom, prenom, adresse, complement_adresse, ville, code_postale, mail, login, pwd FROM bd_principale WHERE login = '".addslashes($login)."'";
    $req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);
       
                
      // On vérifie que l'utilisateur existe bien
    if ($req->rowCount() > 0)
	  {
    	echo 'utilisateur existant';
      $data = $req->fetch();  
      $truc = $data['pwd'];
      echo $truc;
    	 // On vérifie que son mot de passe est correct
	    if ($password == $data['pwd']) 
		  {
      		$loginOK = true;
      }
	  }
	  echo 'utilisateur inexistant';
}

// Si le login a été validé on met les données en sessions
if ($loginOK)
 {
 	$_SESSION['nom'] = $data['nom'];
 	$_SESSION['prenom'] = $data['prenom'];
 	$_SESSION['adresse'] = $data['adresse'];
 	$_SESSION['complement_adresse'] = $data['complement_adresse'];
	$_SESSION['ville'] = $data['ville'];
 	$_SESSION['code_postale'] = $data['code_postale'];
 	$_SESSION['mail'] = $data['mail'];
 	$_SESSION['login'] = $data['login'];

  echo 'Vous etes connecter en tant que:';
  echo  'nom : ',$_SESSION['nom'],
        '<br />prenom : ',$_SESSION['prenom'],
        '<br />adresse : ',$_SESSION['adresse'],
        '<br />complement_adresse : ',$_SESSION['complement_adresse'],
        '<br />ville : ',$_SESSION['ville'],
        '<br />code_postale : ',$_SESSION['code_postale'],
        '<br />mail : ',$_SESSION['mail'],
        '<br />login : ',$_SESSION['login']; 
 }

else 
{ 
echo $login_echap;
//header('Location: loginfaux.html');
}
?>
Je voudrais remplacer le addslash avec une variable preparée comme dans cet exemple (un code qu'on a vu precedement ensemble)
<?php

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

$adre_echap = $bdd->quote($_POST['Itm_8_00_7']);
echo $adre_echap;

if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = $adre_echap";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);

  		if ($req->rowCount() > 0)
			{
            echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login, pwd) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .','. $bdd->quote($_POST['Itm_8_00_9']) .')');
			}
}  
?>
j'ai fait plein d'essai mais rien a faire !
Est ce que si tu utilise un quote pour l'enregistrement dans la bd, le quote modifi t-il la chaine de caractere ou simplement rajoute t-il des ' ' qui ne seront pas interpreter par la suite ?

merci

Re: Insert To probleme

par xTG » 21 janv. 2012, 20:35

Effectivement elle semble ne servir à rien vu que tu accèdes toujours à $_POST. :)

Re: Insert To probleme

par demonjhpn » 21 janv. 2012, 19:12

ok mais je me trompe si je dis que cette ligne ne sert a rien dans mon code ?

Re: Insert To probleme

par xTG » 21 janv. 2012, 17:25

Non extract() n'est pas très bien.
Le mieux est toujours d'appeler un mouton un mouton (et non un animal comme tu le fais avec extract).
Donc si c'est pour accéder à l'index nom provenant d'un formulaire en POST plutôt qu'un extract pour obtenir $nom il est préférable d'accéder à $_POST['nom'].

Re: Insert To probleme

par demonjhpn » 21 janv. 2012, 17:04

<?php

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

$adre_echap = $bdd->quote($_POST['Itm_8_00_7']);
echo $adre_echap;

if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = $adre_echap";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);

  		if ($req->rowCount() > 0)
			{
            echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			}
}  
?>
Voila mon code fonctionne.
le extract($_POST) ca va comme commande ? ou ya mieux ?

merci

Re: Insert To probleme

par demonjhpn » 21 janv. 2012, 16:39

J'essai d'ajouter le pdo quote a la place du addslashe.

pourquoi cette ligne de code ne fonctionne pas ?
$truc = ' . $bdd->quote($_POST['Itm_8_00_1']) . ';
pour ma ligne de code j'ai remplacer par :
$sql = "SELECT mail FROM bd_principale WHERE mail = '. $bdd->quote($_POST['Itm_8_00_1']) . "\n"'";
Mais meme soucis il ne reconnait pas ca:
 '. $bdd->quote($_POST['Itm_8_00_1']) . "\n"'
hum ou ai donc le soucis ? une erreur de syntaxe ?
Pourtant dans ma commande
$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			
la syntaxe identique convient !

:s

merci

Re: Insert To probleme

par xTG » 21 janv. 2012, 07:35

Il y a du pdo::quote() qui manque dans ta première requête (à la place du addslashes()). :)

Re: Insert To probleme

par demonjhpn » 20 janv. 2012, 22:43

<?php

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=bd_principale', 'root', '', $pdo_options);

if ( isset($_POST) && (!empty($_POST['Itm_8_00_7'])) )
{
	extract($_POST);  

  	// On va chercher l'adresse mail dans la base
  	$sql = "SELECT mail FROM bd_principale WHERE mail = '".addslashes($Itm_8_00_7)."'";
  	$req = $bdd->query($sql) or die(mysql_error().'<br />'.$sql);


	echo '<br /> On continu';
  		if ($req->rowCount() > 0)
			{
			echo '<br /> Adresse mail deja utilisé.';
			}	
			else

			{
			$bdd->query('INSERT into bd_principale(nom, prenom, adresse, complement_adresse, code_postale, ville, mail, login) VALUES(' . $bdd->quote($_POST['Itm_8_00_1']) . ', '. $bdd->quote($_POST['Itm_8_00_2']) .', '. $bdd->quote($_POST['Itm_8_00_3']) .', '. $bdd->quote($_POST['Itm_8_00_4']) .', '. $bdd->quote($_POST['Itm_8_00_5']) .', '. $bdd->quote($_POST['Itm_8_00_6']) .', '. $bdd->quote($_POST['Itm_8_00_7']) .', '. $bdd->quote($_POST['Itm_8_00_8']) .')');
			}
}  

?>
Et voila ca fonctionne ! huhu bien content ^^

Merci sTG ! j'aurais surement encore besoin de tes immenses connaissances ^^

Mon code est sûr ?

Re: Insert To probleme

par xTG » 20 janv. 2012, 20:22

Simple problème de quote.
$variable = "test";
echo 'ceci est un $variable'; // ceci est un $variable
echo "ceci est un $variable"; // ceci est un test
Par contre la fonction quote() n'est pas là pour faire jolie, elle permet de sécuriser les données. ;)

Re: Insert To probleme

par demonjhpn » 20 janv. 2012, 20:20

Le remplacement des valeurs par des tokens comme tu dis c'est en fait un test vu que ma premiere requete ne fonctionner pas.

J'avais comme requete a la base ceci:
$bdd->exec('INSERT INTO bd_principale(nom, prenom, adresse, complement_adresse, ville, code_postale,  login, mail) VALUES($nom, $prenom, $adresse, $adresse2, $ville, $code, $login, $mail)');
			
on ne peut donc pas directement les variables de cette maniere ? et avec la fonction prepare ?
je dis peut etre une enormité la ^^

je vais faire les tests avec tes info ! merci bien en tout cas.

Re: Insert To probleme

par xTG » 20 janv. 2012, 19:47

Dans le lien donné il y a un cas qui ressemble au tien :
<?php
// ouverture d'une connexion ...
 
$requete_prepare_1=$connexion->prepare("SELECT identifiant FROM membres WHERE ID_membre = :id"); // on prépare notre requête
$requete_prepare_1->execute(array( 'id' => 1 ));
$lignes=$requete_prepare_1->fetch(PDO::FETCH_OBJ);
echo $lignes->identifiant.'<br />';
?>
Pour les requêtes préparées.
D'une : prepare() et non exec()
De deux : execute() avec en paramètre un array contenant les valeurs à remplacer.

Le lien que tu me donnes montre bien une requête qui est correcte.
Sauf que toi tu remplaces les valeurs par des tokens qui ne sont jamais remplacés par les vrais valeurs !

Enfin pour du code propre et qui se rapproche de ce que tu as vu dans le dernier lien.
On peut utiliser query() en lui fournissant une chaîne SQL qui COMPORTE les données.
Exemple :
$bdd->query('INSERT into test(valeur1, valeur2) VALUES(' . $bdd->quote($valeur1) . ', '. $bdd->quote($valeur2) .')');

Re: Insert To probleme

par demonjhpn » 20 janv. 2012, 18:43

J'ai bien ton article mais je n'ai pas trouver ma reponse ;p
Comme j'ai dis plus haut je debute donc s'il te plait un peu d'indulgence !

Pour ecrire ma requete je me suis inspirer des exemples du site du zero :
http://www.siteduzero.com/tutoriel-3-14514-ecrire-des-donnees.html#ss_part_1
Peut tu me donner une idée d'ou se situe ma boulette ?

merci

Re: Insert To probleme

par xTG » 20 janv. 2012, 17:18

Quand je donne des liens j'aime bien qu'on les lise. :|
La réponse à ton problème :
http://www.siteduzero.com/tutoriel-3-34 ... #ss_part_5

Re: Insert To probleme

par demonjhpn » 20 janv. 2012, 15:15

j'utilise egalement le site du zero pour m'aider a apprendre. La requete que j'ai utilisé provient d'ailleur du site du zero.
Mais c'est sa mise en application avec des variables qui pose soucis ou alors un defaut d'acces a la base mais je ne pense pas.

Merci