Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/10/2011, 17h43   #1
Invité régulier
 
Homme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 9
Points : 9
Par défaut preg_replace et symboles

Bonjour à tous,
j'ai un soucis avec la fonction preg_replace de PHP. J'essaye de remplacer les balises: """, "<", ">" qui apparaissent après avoir fait un nl2br(htmlspecialchars()) sur la chaine $source.

Et quand je fais ceci:

Code :
$source = preg_replace ('#"#', '"', $source);
les """ sont bien remplacé par des guillemets, mais quand j'essaye:

Code :
$source = preg_replace ('#&amp;lt;#', '<', $source);
ça ne marche pas, les "&lt;" ne sont pas remplacés par des "<", ils se contentent de disparaître... avec le reste de la phrase. Le comportement est le même avec "&gt;".

Pourtant si on remplace cette dernière ligne par:

Code :
$source = preg_replace ('#&amp;lt;#', 'A', $source);
il semble que le "&lt;" soit remplacés par des "A". J'ai donc l'impression que ce sont les symboles "<" et ">" qui posent problème dans la fonction.

Mais même en les échappant cela ne fonctionne pas.

Avez-vous un idée du problème ?

Merci.

Cordialement,
Pop360
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 18h20   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 568
Points : 1 568
En quelques mots tu pourrais nous dire dans quel contexte et dans quel but tu souhaites faire cela ? J'ai comme l'intuition que tu pourrais faire autrement...
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 18h49   #3
Invité régulier
 
Homme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 9
Points : 9
Merci d'avoir répondu aussi vite, en fait mon but est d'afficher des champs contenus dans une base de données mysql tout en désactivant les scripts qui aurait pu êtres entrés. Le htmlspecialchars est censé parrer à une éventuelle faille XSS.
Le principal problème c'est que comme ces champs sont censer contenir du code de n'importe quel langage, il n'est pas possible de tout simplement supprimer les balises < > ou même les quotes...

Mais il se trouve que je viens de tester en supprimant tout simplement htmlspecialchars ainsi que les preg_replace(), et tout fonctionne correctement.

Par exemple si j'entre :
Code :
<script type="text/javascript">alert('test de script')</script>
dans le formulaire, à l'affichage il ne s'éxecute pas.
Ce qui d'ailleurs me parait étrange puisque le texte est enregistré tel quel dans la base de données, puis affiché directement
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 19h02   #4
Invité régulier
 
Homme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 9
Points : 9
Ah non, en fait je n'avais pas vu que le texte était traité deux fois :

à l'envoi j'avais déjà mis:

Code :
stripslashes(htmlspecialchars(
du coup en le retirant de l'affichage tout marche

Du coup je pense que le problème est résolu.
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/10/2011, 19h41   #5
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 568
Points : 1 568
En résumé :

- lors de l'enregistrement en bdd, les variables doivent être rentrées sans traitement particulier mais protégées par mysql_real_escape_string (ou équivalent si tu utilises pdo).

- à l'affichage (et uniquement pour l'affichage) tu utilises htmlspecialchars et si besoin nl2br pour respecter les retours lignes.

Ne PAS utiliser htmlspecialchars lors de l'enregistrement en bdd car cela peut poser de sérieux problèmes si tu veux faire des recherches dans tes champs de bdd et rend ta base impropre à l'exportation sans traitement php préalable.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 08h22   #6
Invité régulier
 
Homme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 9
Points : 9
Ah ok, merci pour ces précisions, c'est vrai que d'habitude j'effectue le traitement à l'affichage seulement pour garder l'original, mais je n'avais encore jamais pensé à la recherche dans les champs de la base de données (encore une nouvelle fonctionnalité que je n'ai plus qu'à ajouter ).

Donc maintenant je n'ai plus de traitement avant l'enregistrement, et un htmlsepcialchars ainsi qu'un nl2br pour l'affichage.
Tout marche à peu près, par contre à l'affichage les tabulations qui étaient entrées dans le formulaire disparraissent, ce qui est normal puisque celle ci n'ont pas de balises.
Du coup j'ai l'impression qu'il va falloir faire un preg_replace avant l'enregistrement pour rajouter des balises...
À moins qu'il y ait un équivalent de nl2br pour les tabulations ?
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 18h33   #7
Membre Expert
 
Inscription : septembre 2010
Messages : 1 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 244
Points : 1 568
Points : 1 568
Citation:
Envoyé par Pop360 Voir le message
Tout marche à peu près, par contre à l'affichage les tabulations qui étaient entrées dans le formulaire disparraissent, ce qui est normal puisque celle ci n'ont pas de balises.
Comment faisais-tu auparavant pour qu'elles soient affichées ? et tu les enregistrais comment ?
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 19h13   #8
Invité régulier
 
Homme
Étudiant
Inscription : mai 2011
Messages : 20
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mai 2011
Messages : 20
Points : 9
Points : 9
En fait je crois que les tabulations n'ont jamais été affichées.

Pour l'enregistrement j'ai :

Code :
$source = substr($_POST['source'], 0,5000);
Et pour l'affichage:

Code :
$source = nl2br(htmlspecialchars($donnees['Source']));
Pop360 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h22.


 
 
 
 
Partenaires

Hébergement Web