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

Linux Discussion :

Extraction de chaine et comparaison.


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Extraction de chaine et comparaison.
    Bonjour,

    Je vous présente ma situation :
    Je suis débutant en Shell,
    Je dois "optimiser" un logiciel d'audit de vulnérabilité de code PHP "Graudit 1.5".
    Pour ce faire, je dois extraire des chaines de caractères (des variables PHP) des rapports de Graudit, les retrouver en explorant les dossiers contenant mes fichier PHP et lister l'ensemble des lignes contenant ses variables.

    Voilà l'idée globale.

    En pratique, j'aimerai dans un premier temps, à partir d'un fichier contenant ce type ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /users/usrtest/repPHP/index.php:166: $res=mysql_db_query("$DBdatabase","delete from ^[[01;31m`utilisateur` where `login`^[[00m^[[K = '$login_maj' LIMIT 1;");
    Extraire les variables du type de $login_maj, les lister et éviter les doublons.

    Je suppose qu'il faut définir un pattern disant d'extraire toute chaine de caractère entouré de " ' " et commençant par " $ ".

    Je me suis donc dirigé vers cette solution, en essayant de manipuler GREP, AWK et SED, mais j'avoue que mes résultats sont plutôt infructueux.

    Pour la suite, j'aimerai utiliser le fichier de variable extraite pour le comparer avec mon répertoire de fichier PHP et afficher les résultats nom du fichier et ligne complète. Je ne m'y suis pas vraiment encore penché mais je pense utiliser GREP qui me semble bien adapté.

    J'ai trouvé beaucoup de sujet sur ce forum se rapprochant un peu de certaines parties de ce que je souhaite faire, mais visiblement je n'ai pas réussi à m'en servir à bon escient.

    En vous remerciant par avance, Nayko.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Points : 90
    Points
    90
    Par défaut
    Pour la première partie (extraction des variables), une solution simple (pas trop élaborée mais qui devrait marcher dans ton cas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat t1.txt | awk -F"'" '{print $2}' | cut -c2- | sort -u > t2.txt
    Ensuite tu doit etre plus précis dans ta demande...
    a+

  3. #3
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Pour la deuxième partie, grep est parfaitement adapté (il est fait pour ça).
    Le mieux est de consulter man grep et de regarder les options -f pour l'obtention des chaînes à rechercher dans un fichier (qui serait t2.txt, par exemple) et -n pour afficher le numéro de ligne où a été trouvée la chaîne dans le fichier ; par défaut, le nom de fichier est affiché si la recherche s'étend sur plusioeurs fichiers.
    je pensais à qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -f t2.txt -n $PHP_DIR/*.php*
    Ne pas hésiter à faire des essais, ce n'est pas destructif !

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Alors ! Déjà merci à vous deux pour vos réponses, ça commence à bien se débloquer

    Donc concernant la commande de vpovpo, celle-ci fonctionne vraiment bien, j'ai juste un soucie de faux positif sur ce type de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /users/usrtest/repPHP/index.php:241:         $res=mysql_db_query("$DBdatabase","update ^[[01;31m`utilisateur`^[[00m^[[K set password = '$password' WHERE login = '
    ou il me ressort "tilisateur" (sans le u). Pour le reste j'ai vérifié à la mano cela semble correct.

    J'ai tenté d'ajouter le "$" au pattern de l'AWK mais visiblement je ne maitrise pas cela, je me renseigne donc en ce moment même.

    Concernant la seconde partie de fransoo je vais effectivement procéder comme tu le dis, voir re-utiliser la fonction implanté dans Graudit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    grep    --color=$color \
            --exclude=.svn \
            --exclude=.cvs \
            --exclude=.git \
            -n \
            -R -H -C $context -E \
            -f "$database" "$@" \
            | sed -e"s/--/$separator/"
    En remplaçant donc la valeur de $database par celle de mon fichier de variable sensible.

    Je vous tiens au courant de l'évolution

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Re ! Alors, mon projet a bien avancé, mais je me retrouve encore avec un problème "insoluble"

    J'aurai besoin de faire un pattern avec grep ou autre chose qui ne prend, par exemple, que les variable "$nom" dans un fichier.

    Voici mon code :

    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
    21
    22
    23
    24
    25
    FICHIER=`cat test.txt | awk -F":" '{print $1}' | sort | uniq`
    for FIC in `echo $FICHIER`
            do
            echo "Dans le fichier \"$FIC\" :"
     
            for VAR in `cat filtre.txt`
                    do
     
                    VAR2=`echo $VAR | awk -F"$" '{print $2}'`
     
                    COUNT=`cat test.txt | grep "$FIC" | egrep "[$]$VAR2[![a-zA-Z0-9_]]?" | wc -l | awk '{print $1}'`
     
                    if [ "$COUNT" = "0" ]
                    then
                            echo "   Variable $VAR2 :"
                            echo "      Aucune occurence trouvée pour cette variable"
                    else
                            echo "   Variable $VAR2 avec $COUNT occurence(s) trouvee(s) :"
     
                            cat test.txt | grep "$FIC" | egrep "[$]$VAR2[![a-zA-Z0-9_]]?" | grep -vi "mysql" | egrep -i "[select|insert|delete|update]" | awk -F":" '{print "      ligne n°"$2" - ligne avec requête SQL -"}'
     
                            cat test.txt | grep "$FIC" | egrep "[$]$VAR2[![a-zA-Z0-9_]]?" | grep -vi "mysql" | awk -F":" '{print "      ligne n°"$2}'
                    fi
                    done
    done
    Le problème se situe principalement à ce niveau-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep "[$]$VAR2[![a-zA-Z0-9_]]?"
    Je fais un près-traitement pour essayer de corriger l'indigestion du "$" qu'il ne semble pas apprécier, or c'est bien ce caractère qui quel que soit la situation semble pauser problème.

    En effet, quand je recherche "$nom" il va me trouver "nom" ou "djrffsfjnom_dflkjsd" etc etc etc... Le filtre est plus ou moins efficace, mais ne semble décidément pas suffire, j'ai trop de faux positif :s

    Avez vous une idée ?

  6. #6
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Peut-être en échappant le $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep "\$$VAR2[![a-zA-Z0-9_]]?"
    Ensuite :
    1° cat inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat test.txt | grep "$FIC" | egrep "\$$VAR2[![a-zA-Z0-9_]]?"
    # est avantageusement remplacé par 
    grep "$FIC" test.txt | egrep "\$$VAR2[![a-zA-Z0-9_]]?"
    2° Il faudrait éviter de parcourir deux fois le fichier en créant une variable contenant les lignes sélectionnées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIGNES=$(grep "$FIC" test.txt | egrep "\$$VAR2[![a-zA-Z0-9_]]?")
    En gros, le code deviendrait
    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
    21
    22
    23
    24
    # variable intermédiare inutile
    for FIC in $(awk -F":" '{print $1}' test.txt | sort | uniq)
    do
        echo "Dans le fichier \"$FIC\" :"
        for VAR in $(cat filtre.txt)
        do
            VAR2=$(echo $VAR | awk -F"$" '{print $2}')
            LIGNES="$(grep "$FIC" test.txt | egrep "\$$VAR2[![a-zA-Z0-9_]]?")"
    # Il serait bon de faire un echo "$LIGNES" ici avant afin de voir si le grep est OK
            COUNT=$(wc -l <<<"$LIGNES")
            if [ "$COUNT" = "0" ]
            then
                echo "   Variable $VAR2 :"
                echo "      Aucune occurence trouvée pour cette variable"
            else
                LIGNES="$(echo "$LIGNES | grep -vi mysql)"
                # intermédiare pour éviter de doubler le grep -vi mysql
                # D'ailleurs, ne pourrait-on pas déjà l'inclure au départ de la création de $LIGNES ?
                echo "   Variable $VAR2 avec $COUNT occurence(s) trouvee(s) :"
                echo "$LIGNES" | egrep -i "[select|insert|delete|update]" | awk -F":" '{print "      ligne n°"$2" - ligne avec requête SQL -"}'
                echo "$LIGNES" | awk -F":" '{print "      ligne n°"$2}'
            fi
        done
    done

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Ok !

    J'ai un peu adapté en suivant tes conseils et l'évolution du code !

    Concernant le filtre, la solution était toute bête...(Même en échappant le $ cela ne fonctionnais pas... )

    Ça m'as permis d'alléger le code d'autre part !

    Merci à vous !

Discussions similaires

  1. Extraction de chaine de caractères
    Par asterix76-rouen dans le forum Langage
    Réponses: 4
    Dernier message: 20/12/2006, 23h17
  2. Requete avec extraction de chaine
    Par bestall666 dans le forum Access
    Réponses: 8
    Dernier message: 04/02/2006, 18h17
  3. [String]Extraction de chaîne
    Par sangei dans le forum Langage
    Réponses: 6
    Dernier message: 19/12/2005, 11h25
  4. [XSLT] Extraction de chaine de caractere
    Par Hugo001 dans le forum XSL/XSLT/XPATH
    Réponses: 11
    Dernier message: 28/10/2004, 08h27

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