Auditeur statique PHP

Post on 25-Jan-2015

1.032 views 1 download

description

L'analyse de code PHP se fait le plus souvent manuellement : il faut lire le code pour le comprendre.L'analyse statique permet d'aller plus vite, et dans tous les recoins de l'application : elle travaille sans se lasser, exhaustivement, mais sous direction.Durant la session, nous mettrons en place un analyseur statique pour PHP, pour détecter automatiquement l'arbre des inclusions, les arguments jamais utilisés, les affectations de GPC, et produire un inventaire à la Prévert du code.

Transcript of Auditeur statique PHP

Cornac pour PHPAuditeur statique de code PHP

jeudi 10 mars 2011

Agenda

•Qu’est-ce que Cornac?

•Application et résultats

•Comment améliorer la qualité du code

jeudi 10 mars 2011

Qui parle?

•Damien Seguy

•Consultant à Alter way Consulting, Alter Way Group

•Industrialisation, expertise LAMP

•damien.seguy@alterway.fr

jeudi 10 mars 2011

Yes, we take questionsjeudi 10 mars 2011

./bin/cornac -I spotweb.ini> Tokenizeur

> Auditeur> Done

jeudi 10 mars 2011

Inventaire rapide

jeudi 10 mars 2011

Inventaire rapide

jeudi 10 mars 2011

Inventaire rapide

jeudi 10 mars 2011

Inventaire rapide

jeudi 10 mars 2011

Cornac

•Auditeur statique

•Analyse le code PHP sans l’exécuter

•Scrute une application dans son ensemble

jeudi 10 mars 2011

Ne pas confondre•Xdebug

•xdebug exécute le code

•grep

•grep ne comprend pas la sémantique PHP

•CodeSniffer

•CodeSniffer applique des conventions de codage

jeudi 10 mars 2011

A confondre

•PMD

•PHP Mess Detector

•PHP_Depends

jeudi 10 mars 2011

Liste des .tensions PHP

•Véritable liste des extensions

•Pratique pour les déploiements

•Aimé par les hébergeurs

jeudi 10 mars 2011

Auditeur statique•Traite de grosses quantités de code

•Traite de manière répétitive

•Dépend de l’expérience d’auditeur

•Automatise les recherches

•Systématise les recherches

•Produit beaucoup de faux positifs

jeudi 10 mars 2011

Classes

jeudi 10 mars 2011

Classes

jeudi 10 mars 2011

Classes

jeudi 10 mars 2011

Classes

jeudi 10 mars 2011

Inventaire d’application

•Prendre du recul sur l’application

•Lister les noms utilisés

•Lister les fonctionnalités utilisées

jeudi 10 mars 2011

Aspects techniques

•Lister tous les aspects techniques

•Fonctionnalités PHP

•Fonctionnalités avancées

•Fonctionnalités obsolètes

•Dépendances

jeudi 10 mars 2011

Migration 5.3

•Fonctions obsolètes

•Passage par référence

•Référence après new

•mktime ne prend plus 7 paramètres

jeudi 10 mars 2011

Noms de structure

•Extrait toutes les structures nommées

•Étudie leurs conventions

•Étudie leur ensemble

•Étudie leur sémantique

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

? ? ?

jeudi 10 mars 2011

? ? ?

jeudi 10 mars 2011

Réseau d’inclusions

• include*, require*

• Ignore les variables

• Les cercles sont les fichiers

• Les flèches indiquent l’inclusion

jeudi 10 mars 2011

Réseau d’inclusions

• Inclusions uniques

• Inclusions multiples

• Inclusions d’inclusions

• Inclusions doubles

jeudi 10 mars 2011

Utilisation des constantes

• Lien entre la définition d’une constante et son utilisation

• Les constantes sont utilisées dans leur fichier de définition

• Sauf une

jeudi 10 mars 2011

Aperçu d’ensemble

•Affichage global

•Pas d’analyse détaillée

jeudi 10 mars 2011

Hiérarchies

• Version DOT

• Peu d’extensions

• Où est la classe db?

jeudi 10 mars 2011

Hiérarchies

• Exemple de dotclear

jeudi 10 mars 2011

Hiérarchies

jeudi 10 mars 2011

Version Gephi

jeudi 10 mars 2011

jeudi 10 mars 2011

jeudi 10 mars 2011

Rouages de Cornac

•Cornac utilise le tokenizer de PHP

•Il ajoute une couche de détection des structures complexes

•Il se débarrasse des éléments de syntaxe

•{} [] () ; , ‘’ «»

jeudi 10 mars 2011

2tractions [6] => Array ( [0] => 309 [1] => $world [2] => 1 )

[7] => Array ( [0] => 314 [1] => ! [2] => 1 )

[8] => " [9] => ) [10] => ;

[1] => Array ( [0] => token PHP [1] => code PHP [2] => ligne ) [2] => "

<?php print ("hello $world! "); ?> [1] => Array ( [0] => 266 [1] => print [2] => 1 )

[2] => Array ( [0] => 370 [1] => [2] => 1 )

[3] => ( [4] => " [5] => Array ( [0] => 314 [1] => hello [2] => 1 )

jeudi 10 mars 2011

2tractions<?php print ("hello $world! "); ?>

jeudi 10 mars 2011

2tractions

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Liste des variables

jeudi 10 mars 2011

Iffectations

jeudi 10 mars 2011

Iffectations

jeudi 10 mars 2011

Iffectations

jeudi 10 mars 2011

Iffectations

jeudi 10 mars 2011

Classes inutilisées

• Classes, propriétés, variables, fonctions, constantes

jeudi 10 mars 2011

Fonctionnement

Token

izeurAuditeur Affichage

Analyzer

jeudi 10 mars 2011

Evolution

Token

izeurAuditeur

Analyzer

•Web

•XML

•ODS

•PHPCodeBrowser

•Sonar

jeudi 10 mars 2011

Règles•Sécurité

•Recommandations (groupe PHP, CMS..)

•Conventions maison

•Migration PHP 5.3

•Performances

•Motif de conceptions

jeudi 10 mars 2011

http://www.cornac.info/damien.seguy@alterway.fr

jeudi 10 mars 2011

jeudi 10 mars 2011