Encodage caractères

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 : Encodage caractères

Re: Encodage caractères

par jack in the box » 24 sept. 2014, 00:25

Bonsoir à tous !
Ça y est ! j'ai réussi à trouver la bonne syntaxe ! Mais j'ai sué, hein
Pour ceux que ça peut intéresser, la voilà :
...
  //création de la requète SQL:
  $sql = " INSERT INTO offres ( num, nom, prenom, o_jar, o_dom, o_gar, o_cou, o_act, o_ser, o_tra, o_bro)
	VALUES ( '$num', '$nom', '$prenom', '".mysql_real_escape_string(stripslashes($o_jar))."', 
	'".mysql_real_escape_string(stripslashes($o_dom))."', '".mysql_real_escape_string(stripslashes($o_gar))."', 
	'".mysql_real_escape_string(stripslashes($o_cou))."', '".mysql_real_escape_string(stripslashes($o_act))."', 
	'".mysql_real_escape_string(stripslashes($o_ser))."', '".mysql_real_escape_string(stripslashes($o_tra))."', 
	'".mysql_real_escape_string(stripslashes($o_bro))."') " ;
 ...
Merci à tous ceux qui m'ont aidé de leurs conseils :-)))

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 22:05

Et le code qui retourne certaines valeurs de la table à l'affichage :
(mais celui-là ne fait pas de problème, même si je ne comprends pas par quel miracle il me retourne bien des éé àà èè, alors que sous (sur?) PHPMyAdmin la table n'affiche que des À© À©À©, mais bon, ça fonctionne...)
...
<?php
	echo '<h2>'."Offres Jardin et Nature".'</h2>'.'<br>';

$bdd = new PDO('mysql:host=#######;dbname=#######','#######','#######');
$require = $bdd->query('SELECT num, nom, prenom, o_jar from offres WHERE o_jar!="" ORDER BY num DESC');

while ($data = $require->fetch()){
	echo "n&deg d'adh&eacuterent : ".'<b><big>'.$data[num].'</big></b>'." / ".$data[nom]." ".$data[prenom]." / ".$data[o_jar].'<br>';
	echo '<hr>';
}
$require ->closeCursor(); 
?>
...

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 21:57

Bonsoir,
merci pour ces réponses, même si je pige pas toutes les questions... lol
Pour les drivers, je sais pas... Ils sont où ? quelque part sur mon disque ? faut les télécharger ? ils sont sur la base ? chez l'hébergeur ? ......
Pour le code, en voilà un bout (enfin, celui qui récupère les variables pour les mettre dans la base) :

Code : Tout sélectionner

... <?php header('Content-Type: text/html; charset=UTF-8'); include("connexion.php") ; // if ($_POST['num']!='') { connexion() ; //récupération des valeurs des champs: //num: $num = $_POST["num"] ; //nom: $nom = $_POST["nom"] ; //prenom: $prenom = $_POST["prenom"] ; //offres jardin et nature $o_jar = $_POST["o_jar"] ; //offres aide domestique $o_dom = $_POST["o_dom"] ; //offres garde et baby-sitting $o_gar = $_POST["o_gar"] ; //offres Cours et conseils $o_cou = $_POST["o_cou"] ; //offres activitó diverses $o_act = $_POST["o_act"] ; //offres services $o_ser = $_POST["o_ser"] ; //offres travaux et bricolage $o_tra = $_POST["o_tra"] ; //offres brocante $o_bro = $_POST["o_bro"] ; //création de la requète SQL: $sql = "INSERT INTO offres ( num, nom, prenom, o_jar, o_dom, o_gar, o_cou, o_act, o_ser, o_tra, o_bro) VALUES ( '$num', '$nom', '$prenom', '$o_jar', '$o_dom', '$o_gar', '$o_cou', '$o_act', '$o_ser', '$o_tra', '$o_bro') " ; //exécution de la requète SQL: $requete = mysql_query($sql) or die( mysql_error() ) ; } ...

Re: Encodage caractères

par xTG » 23 sept. 2014, 20:09

Quel driver utilises-tu ?
- mysql_query ? => Mysql => mysql_real_escape_string qu'il te faut utiliser pour protéger les variables
- mysqli_query ? => Mysqli => mysqli_real_escape_string
- query ? => PDO à priori => PDO::quote
- exec / execute ? => PDO => les paramètres sont déjà protégés si tu les passes dans exec ou execute (mais pas si tu les mets directement dans la requête par contre !)
J'ai regardé "addslashes", sans comprendre si j'étais ou pas dans le champ possible d'application.[/quote
Surtout pas, addslashes n'est pas fait pour contrer les injections SQL, seulement échapper certains caractères.
un bout de code qui recherchait les quote dans les chaines de variables et leur en ajoutait une seconde
Bricolage encore pire que d'utiliser addslashes...
Certains me parlent de me protéger des injections SQL, d'autres de faire les injections ... qui croire ?
Quand tu insères une variable dans une requête SQL on parle d'injection.
Cependant il peut y avoir des injections non contrôlées, les fonctions de protection sont là pour éviter cela.
Si tu injectes par exemple le mot de passe dans une requête pour un formulaire de connexion sans le protéger et que l'utilisateur rentre : ' OR 1=1
Dans ce cas il y a une injection non contrôlée qui permet de se connecter sans connaître le mot de passe.

Exemple de protection contre l'injection avec le driver Mysqli :
<?php
$maVariable = mysqli_real_escape_string($maVariable);
$sql = 'SELECT * FROM maTable WHERE maVariable = ' . $maVariable;
$res = mysqli_query($sql);

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 18:56

Euh pas page 1, la page de la fonction en question pour regarder les exemples et ainsi comprendre ce qu'elle fait est suffisant en fait. :twisted:
C'est bien ça le problème...
J'ai surtout l'impression que tous ces exemples (que je pige à peine à moitié, d'accord...[d'où la réf à la page 1] ne s'appliquent pas à mon cas...

J'ai bien regardé le lien vers PDO::quote : je vois pas que ça me concerne, sauf que j'ai effectivement une instruction PDO dans la requête...
J'ai regardé "addslashes", sans comprendre si j'étais ou pas dans le champ possible d'application.

J'avais trouvé quelque part (mais où?? j'en ai tellement vu...) un bout de code qui recherchait les quote dans les chaines de variables et leur en ajoutait une seconde. Ce truc me plaisait bien, mais est-il adapté à mes requêtes, mystère ! De toute façon, je ne sais plus où c'est

Certains me parlent de me protéger des injections SQL, d'autres de faire les injections ... qui croire ?

Je me décourage un peu. Je trouvais que j'avais bien avancé en découvrant les bases de données MySQL, les formulaires et les requêtes, mais là je vois bien que c'est plus compliqué quand on entre un peu dans les détails... le Diable est dans les détails dit-on...

Re: Encodage caractères

par xTG » 23 sept. 2014, 17:28

Euh pas page 1, la page de la fonction en question pour regarder les exemples et ainsi comprendre ce qu'elle fait est suffisant en fait. :twisted:

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 15:47

Oui, j'ai bien lu et même suivi les liens proposés plus haut par moogli...

Mais j'ai rien compris !
Va falloir que je prenne le manuel à la page 1 ...

Mais si quelqu'un avait une moulinette toute faite pour le coup de apostrophes ... :-)

Re: Encodage caractères

par xTG » 23 sept. 2014, 13:39

ce qui est un le cas type permettant une injection sql.

par exemple si tu utilise mysql tu peux utiliser les fonctions
mysql_real_escape_string : si extension mysql (pas bien il est préférable d'utiliser mysqli ou pdo)
mysqli_real_escape_string : si tu utilises mysqli
PDO::quote : si tu utilise PDO
;)

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 09:42

Bonjour,
se protéger des injections sql ??? ça c'est chinois pour moi !

C'est en remplissant le formulaire que les utilisateurs vont mettre des apostrophes qui font tout planter.
Y a t-il un moyen de les doubler automatiquement ??

Le lien vers le formulaire, si vous voulez tester : http://www.dream-catcher.fr/BDD/formulaire.php
Puis le lien vers une requête : http://www.dream-catcher.fr/BDD/lire_o_jar.php

Re: Encodage caractères

par ynx » 23 sept. 2014, 09:11

Salut,

Comme indiqué par Moogli, l'apostrophe est un caractère réservé en mysql, il faut donc le doubler pour l'utiliser dans une requête.
Mais tu ne devrais pas avoir à te soucier de ca si tu protège correctement tes données contre les injections sql.

Bonne journée

Re: Encodage caractères

par arnaud69 » 23 sept. 2014, 09:06

Voilà, avant chaque requête tu passes donc SET NAMES UTF8.
L'analyse de l'avant projet, ah quelle belle idée ! C'est toujours après que l'on s'en rend compte... :lol: :lol:

Re: Encodage caractères

par jack in the box » 23 sept. 2014, 08:50

Bon, j'ai un peu avancé...
En mettant bien la déclaration du charset UTF8 dans toutes les requêtes, j'arrive à récupérer correctement toutes les lettres accentuées.
Sauf que sur PHPmyAdmin dans la table, c'est toujours des hiéroglyphes... mais bon, ça fonctionne...

Il me reste la question des apostrophes à bosser...
Si quelqu'un a quelque chose de simple et standard, je suis preneur.

Je vous tiens au courant pour la suite.

Re: Encodage caractères

par moogli » 22 sept. 2014, 14:44

salut,

1/ utilise une page html complète (html, head etc ) cela te permetteras d'y indiquer le charset de la page (<meta http-equiv="content-type" content="text/html; charset=UTF-8" />)
2/ tu peux y ajouter la même info dans l'entête http (via la fonction header) cela évitera de laisser supposer au navigateur du type d'encodage
3/ je suppose que c'est une erreur SQL que tu as et non une erreur php (effectivement c'est php qui te l'indique mais l'erreur c'est du SQL).
Pour éviter cela un te faut échapper correctement les ' (donc en sql en les doublant). CEla te permet d'aborder la notion de faille type injection SQL.

sans code on ne peux pas t'aider beaucoup plus. Je peux simplement te dire que tu dois foire un truc du genre :
<?php
$sql = 'insert into latable value('.$_POST['field1'].','.$_POST['field_2'].', ........)';
?>
ce qui est un le cas type permettant une injection sql.

par exemple si tu utilise mysql tu peux utiliser les fonctions
mysql_real_escape_string : si extension mysql (pas bien il est préférable d'utiliser mysqli ou pdo)
mysqli_real_escape_string : si tu utilises mysqli
PDO::quote : si tu utilise PDO

@+

Re: Encodage caractères

par jack in the box » 22 sept. 2014, 14:15

Merci.
Oui, comme moi, sauf que ...

Ici (au boulot, chuutt!) Firefox + Windows XP :
n° d'adhérent : 1230 / mémé guérini / un trou
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé
la lecture se fait en "occidental"
mais, en basculant l'affichage en "Unicode", j'ai :
n° d'adhérent : 1230 / mémé guérini / un trou
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé

A la maison, Firefox sur Windows7, j'ai beau basculer l'affichage en "Unicode" ça ne prend pas et ça revient automatiquement en "Occidental", donc :
n° d'adhérent : 1230 / mémé guérini / un trou
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé

Reste le problème de l'apostrophe : si j'en mets une seule, j'ai un msg d'erreur du php.
Il me faut en mettre 2 pour qu'il en arrive une seule sur la table. J'y comprends rien !

Re: Encodage caractères

par en_passant_bob » 22 sept. 2014, 14:00

=; Chez moi avec Opéra et autres navigateurs !

Offres Jardin et Nature

n° d'adhérent : 1230 / mémé guérini / un trou
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé
n° d'adhérent : 1 / fdfdfgd èèèèèèè / éééééé
n° d'adhérent : 1 / fdfdfgd gérard / éééééé