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 :

Echappement de caractères


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Echappement de caractères
    Salutations,

    J'ai un problème d'échappement de caractères. Il se situe à ce niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     $sql = "select fichier_travail from travaux_$contrat where reference_tech='$li'";
     $ex = query($sql);
     $file = utf8_decode($ex[0]);
     $file_folder = "documents/$contrat/$file";
     if(file_exists($file_folder))	$zip->addFile($file_folder,utf8_encode($file));
    Mes utilisateurs ont la bonne idée de mettre des caractères interdits dans leurs noms de fichiers, genre des apostrophes (et bien entendu des ô ou des é, les 'ô' sont vraiment une plaie à traiter, ca provoque bizarrement bien plus d'erreurs que les E accents).

    Voilà comment fonctionne le bout de code au dessus:
    Je récup des noms de fichiers de ma db, je les décode, je les ajoute à l'archive en mettant un nom encodé). Déjà sans cette manip, impossible de constituer l'archive.
    Pour une raison que j'ignore, je n'arrive pas à échapper les apostrophes des noms de fichiers issus de ma db. addslashes a décidé de ne pas m'aider.
    Les fichiers en questions sont alors ignorés par mon file_exists qui renvoie false puisqu'il ne les trouve pas.
    str_replace ne donne pas plus de résultats.

    Une idée pour échapper ces caractères ?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $file=str_replace('\'',' ',$file);
    Problème réglé.

  3. #3
    Membre émérite
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 939
    Points : 2 287
    Points
    2 287
    Par défaut
    Bonjour

    Ma question n'a rien à voir avec le fond de votre discussion.

    J'aimerais savoir pour quelle raison vous n'utilisez pas les requêtes préparée avec PDO, par exemple?

    J'ai cru lire que votre façon de faire, c'est-à-dire, la concaténation des informations était la porte ouverte aux injections SQL.

    Pierre

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    C’est une bonne remarque. Cela dit, dans le cas présent il n’est possible d’améliorer que la moitié de la requête :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $statement = $pdo->prepare("SELECT fichier_travail FROM travaux_$contrat WHERE reference_tech = :li");
    $ex = $statement->execute([ ':li' => $li ]);

    Car il n’est pas possible de substituer un nom de table. Avoir des noms de table dynamiques n’est pas une situation courante, et les moteurs SQL sont incapables de préparer un plan de requête quand ils ne savent même pas sur quelle table la requête va se faire

    Le mieux qu’on puisse faire c’est d’utiliser PDO::quote pour sécuriser la variable $contrat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $nom_table = $pdo->quote("travaux_$contrat");
    $statement = $pdo->prepare("SELECT fichier_travail FROM $nom_table WHERE reference_tech = :li");
    $ex = $statement->execute([ ':li' => $li ]);
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Je ne me préoccupe absolument pas de sécurité, déjà parce que je n'y ai aucune expertise (je laisse ça au bon soin du reste du service info), et ensuite parce que ce que je développe est destiné à être déployé sur un intranet. Le risque qu'une personne curieuse au mieux, malveillante au pire s'attaque à ce que je dev est vraiment très faible.

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ce n'est pas parce que c'est limité à un intranet qu'il n'y faut complètement ignorer les bases de l'interface utilisateur qui sont "l'utilisateur est bête, maladroit et/ou méchant". Après tout, ton problème de base vient du fait que tes utilisateurs mettent des caractères interdits dans des noms de fichiers Simplement dans ton cas, tu vas davantage te protéger contre les bêtises et les maladresses que contre les intentions malveillantes.
    C'est la même différence qu'entre utiliser un préservatif avec un coup d'un soir ou avec sa moitié de longue date

    Et sinon, pour le cas du nom de la table, on peut aussi vérifier que le nom de la table existe bien dans une liste pré-définie (ou à récupérer par une requête du type SHOW TABLES)
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2016
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Je fais justement mon maximum pour me mettre à la place d'un utilisateur qui fait n'importe quoi, pour éviter un maximum de problèmes en amont.
    Le principal problème là venait en fait de l'encodage.

    Les pages sont en utf8 et la db est en latin1. Partant de là, je dois faire toute une gymnastique pour avoir des noms de fichiers qui ne sautent pas (ou pire qui font tout crash), et qui puissent être à la fois dl et affichés avec les bons caractères. J'ai mis un moment à comprendre comment tout cela fonctionnait mais maintenant on est bon, je ne m’embrouille plus trop.

    Dans le cas qui m'a poussé à ouvrir le sujet, c'était une erreur stupide qui faisait que je n'obtenais aucun résultat avec aucune méthode d'échappement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP-JS] Les caractères spéciaux
    Par yaya0057 dans le forum Langage
    Réponses: 2
    Dernier message: 05/03/2007, 18h51
  2. [PHP-JS] GET : Caractères interdits
    Par linar009 dans le forum Langage
    Réponses: 9
    Dernier message: 03/08/2006, 12h44
  3. [Oracle] [php] insert de caractères accentués
    Par badcur dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 15/06/2006, 16h42
  4. [PHP][XSLT] problème caractères accentués
    Par beho dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 29/05/2006, 09h29
  5. [Conception] Echappement de caractères
    Par nicoaix dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/04/2006, 19h32

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