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 Perl Discussion :

[langage] Probleme avec caractère '$' dans script Perl


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut [langage] Probleme avec caractère '$' dans script Perl
    Bonjour,
    je teste le code ci-dessous mais les lignes contenant le symbole '$' bloque le fonctionnement du script.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #!/usr/bin/perl -wT
    use strict;
    use CGI ':standard';
     
     
    mkdir("./test",0777);
    open (LOG,">./test/index.php");
     
    # flock (LOG,2);
    print LOG "/* ON DETERMINE LE NOM DU REPERTOIRE EN COURS */\n";
    print LOG "$Rep_actif=substr(strrchr(dirname($PATH_TRANSLATED),'/'),1);\n";
     
    print LOG "/* REDIRECTION VERS LA PAGE INDEX DE L APPLICATION */\n";
    print LOG "header("Location:../../index.php?IdRep=".$Rep_actif);\n";
     
    close (LOG);
     
    print "Content-type: text/html\n\n";
    print 'Création du répertoire et de son fichier index réussi !';
    Comment faire pour que $Rep_actif soit considéré comme une chaine texte et nom comme une variable ?

    Merci

  2. #2
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 49
    Points : 52
    Points
    52
    Par défaut
    J'ai eu un problème similaire. Aparament Perl ,n'apprécie que moyennement les multiples traitement sur une seule ligne. Si tu découpes ta chaine avant de l'afficher, çà donne quoi?

    Ensuite pourquoi tu places tes "" autour de $Rep_actif puisqu'il sera interprété comme étant une chaine?
    [code:1]man -k probleme[/code:1]
    :code:

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Je saisi pas!

    Ce script en fait écrit un fichier php qui lui utilisera des variables '$'.

    si j'utilise que le code ci-dessous cela fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #!/usr/bin/perl -wT 
    use strict; 
    use CGI ':standard'; 
     
     
    mkdir("./test",0777); 
    open (LOG,">./test/index.php"); 
     
    # flock (LOG,2); 
    print LOG "/* ON DETERMINE LE NOM DU REPERTOIRE EN COURS */\n"; 
    print LOG "Rep_actif=substr(strrchr(dirname(PATH_TRANSLATED),'/'),1);\n"; 
     
    print LOG "/* REDIRECTION VERS LA PAGE INDEX DE L APPLICATION */\n"; 
    print LOG "header("Location:../../index.php?IdRep=".Rep_actif);\n"; 
     
    close (LOG); 
     
    print "Content-type: text/html\n\n"; 
    print 'Création du répertoire et de son fichier index réussi !';

    Mais ça me sert à rien...

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    De façon générale, dans nombre de langages, le caractère \ a des propriétés un peu magiques dans les chaînes. En particulier, l'ajouter devant un caractère qui n'a pas de propriété particulière lui donne souvent un "sens" différent (exemple le n et \n), mais l'inverse peut également être dit, c'est à dire qu'un \ placé devant un caractère qui a un "sens" spécial le rendra ordinaire (exemple par excellence \ et \\ ! ).
    Dans votre cas, le caractère spécial qui provoque un phénomène indésiré est le $, aussi il vous suffit de "l'échapper" comme on dit : \$ .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print LOG "\$Rep_actif=substr(strrchr(dirname(\$PATH_TRANSLATED),'/'),1);\n";
    Une autre solution est d'utiliser les simples quotes ' pour entourer votre chaîne, mais ceci pose d'autres problèmes ici vu que vous utilisez d'autres ' et un \n qui ne serait pas interprété dans une chaîne entre '.


    --
    Jedaï

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Merci ça a l'air de fonctionner.
    J'ai trouvé que cette solution pour parer le SAFE MODE de Php.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Cepandant un un problème se pose avec le code ci-dessous!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/perl -wT
    use strict;
    use CGI ':standard';
     
     
    my $IdForum = param('Id_forum');
    mkdir ('./$IdForum',0777);
    le répertoire créé s'appelle '$IdForum' et non pas comme la valeur de param('Id_forum') transmis au script

    Comment résoudre cela :

    Merci

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 90
    Points : 96
    Points
    96
    Par défaut
    salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mkdir ("./$IdForum",0777);
    il ne faut pas mettre de simple quote sinon tes variables ne sont pas interpretees
    utilise des doubles quotes, ou pas de quotes du tout si tu as simplement une variable ( par exemple mkdir ($dir, 0777) )

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/perl -wT
    use strict;
    use CGI ':standard';
     
     
    my $IdForum = param('Id_forum');
    mkdir ("./$IdForum",0777);
    Cette fois ça me dit :

    Internal Server Error
    The server encountered an internal error or misconfiguration and was unable to complete your request....

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu tournes en mode tainted, si tu veux mon avis, mkdir ne doit pas trop apprécier que tu lui demande d'utiliser une variable encore "taintée". Tu peux nettoyer la variable en la faisant passer par une regex par contre.

    --
    Jedaï

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    tainted : J'ai trouvai ça mais j'y pige rien
    Q17: How do I "untaint" a variable?
    Once a variable is tainted, Perl won't allow you to use it in a system(), exec(), piped open, eval(), backtick command, or any function that affects something outside the program (such as unlink). You can't use it even if you scan it for shell metacharacters or use the tr/// or s/// commands to remove metacharacters. The only way to untaint a tainted variable is by performing a pattern matching operation on it and extracting the matched substrings. For example, if you expect a variable to contain an e-mail address, you can extract an untainted copy of the address in this way:
    $mail_address=~/(\S+)\@([\w.-]+)/ or die "invalid address";
    $untainted_address = "$1\@$2";

    This pattern match accepts e-mail addresses of the form "who@where" where "where" looks like a domain name, and "who" consists of one or more non-whitespace characters. Note that this regular expression will not remove shell meta-characters from the e-mail address. This is because it is perfectly valid for e-mail addresses to contain such characters, as in:
    fred&barney@bedrock.com
    Just because you have untainted a variable doesn't mean that it is now safe to pass it to a shell. E-mail addresses are the perfect examples of this. The taint checks are there in order to force you to recognize when a variable is potentially dangerous. Use the techniques described in Q44 to avoid passing dangerous variables to the shell.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    Apparement il s'agit bien d'un problème lorsque le parametre est transmis par l'Url.

    Ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl -wT
    use strict;
    use CGI ':standard';
     
     
    my $dir = param('Id_forum');
    my $dir_path = "../html/repertoire";
     
    mkdir ("$dir_path/$dir", 0777);
    Lorsque je déclare ma variable dans le script tout fonctionne bien!

    Fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/perl -wT
    use strict;
    use CGI ':standard';
     
    my $dir = "test";
    my $dir_path = "../html/repertoire";
     
    mkdir ("$dir_path/$dir", 0777);
    Pourquoi :

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 97
    Points : 47
    Points
    47
    Par défaut
    J'AI TROUVE

    Il suffit de supprimer le switches T permettant de signaler une erreur en cas d'utilisation de données exterieures non controlées (tainted).

    Fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/perl -w 
    use strict; 
    use CGI ':standard'; 
     
     
    my $dir = param('Id_forum'); 
    my $dir_path = "../html/repertoire"; 
     
    mkdir ("$dir_path/$dir", 0777);
    Tous ces cheveux arrachés pour un semble T Snif

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

Discussions similaires

  1. [langage] Problème avec un script ! :(
    Par shinux2004 dans le forum Langage
    Réponses: 6
    Dernier message: 16/02/2005, 16h12
  2. Réponses: 12
    Dernier message: 30/07/2004, 16h43
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 13h32
  4. [langage] probleme avec un hash de hash
    Par planetevoyage dans le forum Langage
    Réponses: 4
    Dernier message: 06/06/2003, 13h55
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 19h26

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