IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

preg_replace et symboles


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $source = preg_replace ('#"#', '"', $source);
    les """ sont bien remplacé par des guillemets, mais quand j'essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $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

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    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...

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    <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

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Ah non, en fait je n'avais pas vu que le texte était traité deux fois :

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stripslashes(htmlspecialchars(
    du coup en le retirant de l'affichage tout marche

    Du coup je pense que le problème est résolu.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    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.

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    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 ?

Discussions similaires

  1. Code ASCII du symbole Euro
    Par FW-S dans le forum Delphi
    Réponses: 9
    Dernier message: 03/04/2007, 01h27
  2. [Flash Mx 2004] - Supprimer un symbole
    Par alucard dans le forum Flash
    Réponses: 4
    Dernier message: 05/01/2004, 16h03
  3. Organigramme d'un algorithme, convention de symboles
    Par rstephane dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 12/06/2003, 17h47
  4. [Sybase] Définition des symboles
    Par SoaB dans le forum Sybase
    Réponses: 5
    Dernier message: 19/03/2003, 23h06
  5. symbole ##
    Par JEG dans le forum C
    Réponses: 2
    Dernier message: 23/01/2003, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo