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

Conception Web Discussion :

Audit code source PHP / Laravel - Besoin d'avis


Sujet :

Conception Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2014
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2014
    Messages : 88
    Par défaut Audit code source PHP / Laravel - Besoin d'avis
    Bonjour à tous et toutes, et bonne année.

    Je viens ici pour avoir des avis SVP (des avis neutres et des avis réalistes).

    Le week-end dernier, une entreprise m’a demandé de faire un léger audit. Entreprise, que je vais ci-dessous nommer "Entreprise cliente".

    Tout d’abord, je résume :

    Cette "Entreprise cliente" (une PME d’une dizaine de salariés) avait d’abord fait développer son logiciel web (PHP / Laravel / MySQL) par une "Agence web A".

    Aujourd’hui cette "Entreprise cliente" est très dépendante de ce logiciel.

    Puis un jour, cette "Entreprise cliente" a décidé d'arrêter de travailler avec "Agence web A".

    Mais avant de trouver un autre prestataire pour continuer le développement et la maintenance de son logiciel, elle a (en 2024) décidée de faire appel à une "Agence B" (agence spécialisée en audits) afin de faire un audit intégrale du son logiciel web (un audit de code source PHP / Laravel).

    Entre parenthèses : cette "Agence B" lui avait facturé 300 € HT de l’heure, pour un total d’environ 10 000 € HT.

    Et la conclusion de leur audit est que tout était à peu prèt ok. (l’"Agence B" dit ne pas avoir trouvée d’anomalie dans le code source PHP / Laravel...).

    Une fois que cette "Agence B" a fini l’audit du code source, cette "Entreprise cliente" me demande à moi aussi de regarder le code source afin que je donne mon avis. (Et cette "Entreprise cliente" m'a aussi demandé de regarder le PDF du rapport d'audit).

    Donc le week-end dernier, j'ai pris une journée afin de faire un tour du code source PHP / Laravel.

    Et je constate que l’audit de "Agence B", a : soit été fait à l’arrache, soit pas été fait du tout, ou soit a été fait par un développeur junior (mais vraiment très junior).

    Voici un résumé de ce que j’ai pu constater comme problèmes majeurs :

    (problèmes majeurs, qui n'ont pas été constatés dans l'audit de "Agence B"...)

    - Génération excessive de requêtes SQL sur les pages de listing

    La grande majorité des pages de listing de ce logiciel génèrent un nombre extrêmement élevé de requêtes SQL.
    Certaines pages génèrent des milliers de requêtes SQL (parfois + de 15 000 requêtes SQL !). Car elles ont quasiment toutes des "problèmes N+1", et certaines pages ont une absence totale de pagination, etc.

    Voici un exemple :

    Laravel Debugbar (un outil connu de debug pour Laravel):

    http://www.laravel-cms-preprod.daw-d...ge-exemple.png

    Et CPU saturé :

    http://www.laravel-cms-preprod.daw-d...CPU-sature.png

    Dans la 2ème image, on peut voir que le CPU du serveur est saturé à 100%.

    Je précise que c’est un VPS où il y a seulement ce logiciel d'hébergement.

    Et je précise aussi que (à ce moment là, lorsque j’ai pris cette impr écran) que j'étais le seul à utiliser le logiciel. Et que j’ai juste afficher une simple page de listing…

    En regardant le code source, on peut très facilement voir ce problème dans (quasiment) toutes les pages de listing...

    Voici un simple exemple de code source :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /**
     * Problème dangereux de perf. 19 838 req SQL !
     */
    public function all(Request $request)
    {
        // Table 'dossier_vendeur' (5300 lignes).
        $dossiers = DossierVendeur::orderBy("ines", "DESC")->orderBy("ref_commercialisation", "DESC");
    
        if(!empty($request->input("name"))) {
            // ICI : problème dangereux de perf (CPU saturé).
            //Car ici ça charge toutes les lignes de la table 'dossier_vendeur' (5300 lignes).
            $temp_dossiers = DossierVendeur::latest()->get();
    
            $tabDossierNames = [];
            foreach($temp_dossiers as $temp){
                foreach($temp->vendeurs as $vendeur) {
                    $tmp_name = afdt_decrypt($vendeur->last_name);
                    if(preg_match("/".$request->input("name")."/i", $tmp_name)){
                        if(!in_array($temp->id, $tabDossierNames))
                            $tabDossierNames[] = $temp->id;
                    }
                }
                foreach($temp->partners as $vendeur) {
                    $tmp_name = afdt_decrypt($vendeur->title)." ".afdt_decrypt($vendeur->last_name);
                    if(preg_match("/".$request->input("name")."/i", $tmp_name)){
                        if(!in_array($temp->id, $tabDossierNames))
                            $tabDossierNames[] = $temp->id;
                    }
                }
            }
            if(!empty($tabDossierNames)){
                $dossiers = $dossiers->whereIn("id", $tabDossierNames);
            }
        }
    
        $count = $dossiers->count();
        $nb_pages = $count != 0 ? ceil($count / 25) : 0;
    
        $dossiers = $dossiers->skip($page * 25)->take(25)->get();
    
        return view('back.dossier_vendeur.list', [
            'dossiers' => $dossiers,
        ]);
    }
    (et dans le code source, quasiment toutes les pages ont ce problème, et dans le code source : c'est flagrant...).

    - MySQL - Absence totale de clé étrangère dans la base de données

    J’ai pu constater qu'il y a zéro clé étrangère.
    PS : cette BDD (MySQL) a 59 tables.

    - MySQL - Absence d’indexs dans la base de données

    Les seuls indexs que j’ai pu voir, sont les clés primaires, et quelques (très rares) indexs d’unicité.

    - PHP / MySQL - Absence totale des transactions

    J’ai pu constater une absence totale des transactions MySQL.

    - Des milliers de fichiers PDF accessibles publiquement

    J’ai pu constater que des milliers de fichiers PDF confidentiels, sont accessibles publiquement (sans anthentification) via une simple URL : www.domaine-du-client.fr/5658/pdf-agence/viewer

    Vos avis SVP :

    Maintenant, qu'en pensez-vous ?

    Car pour un audit à 10k €, ne pas avoir trouvé ces [/B]problèmes majeurs[/B]...

    Personnellement, je pense qui si l’audit aurait réellement été fait (même par un junior), que ces problèmes aurait été vu, et que l'entreprise cliente aurait été informé la gravité de la situation et sur la criticité de ces problèmes majeurs…

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 681
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 681
    Par défaut
    vous souhaitez notre avis pour prendre quelle décision ?
    par exemple conseiller à votre client de demander le remboursement de l'audit ? si c'est pour ça, il faudra étudier le contrat signé pour cette prestation et voir quelles sont les promesses qui ont été faites par écrit.

    en ce qui concerne le manque d'index et les scripts qui chargent toutes les données, je dirais que ce n'est pas le plus grave (même si je trouve déjà ça très grave pour un développeur de faire cela). il "suffit" de multiplier le budget serveurs et c'est reparti pour quelques années.

    pour les fichiers accessibles sans protection, cela engage votre client. que ce soit des documents de personnes privées ou d'entreprises, votre client peut se retrouver avec des grosses amendes en cas de fuite d'un de ces documents.

    votre remarque sur le manque de clés étrange m'inquiète sur la structure de la base de données. de ce que vous avez-vous, est ce que les tables ont l'air d'être normalisées ? sans cela, cela ne vaut même pas la peine de réécrire le code qui va s'occuper de ces données.

Discussions similaires

  1. Encoder le code source PHP
    Par berceker united dans le forum Langage
    Réponses: 18
    Dernier message: 31/07/2009, 20h57
  2. Audit de code source PHP
    Par TSnarfK dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/05/2009, 14h59
  3. Code source PHP
    Par SergeantLegend dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2007, 17h07
  4. comment sécurisez mon code source php?
    Par dahan dans le forum Zend
    Réponses: 2
    Dernier message: 08/02/2007, 20h44
  5. [Sécurité] Afficher le code source PHP
    Par tigzirt dans le forum Langage
    Réponses: 2
    Dernier message: 12/05/2006, 08h42

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