Frage

Ich habe einige "Schnüffler" aus den Codierungsstandards "generischer" und "Squiz" studiert CodesNifferen Version 1.3, und lernte genug, um ein paar "benutzerdefinierte" Schnüffler zu schreiben, um einige codierende Anti-Muster zu fangen, die spezifisch für ein PHP-Projekt sind, an dem ich arbeite.

Aber jetzt möchte mein Chef, dass ich mit dem Tool alle Orte identifizieren kann, an denen der Code exec (), popen (), passthru () aufruft oder den Back -Tick -Operator verwendet, um einen "externen" Befehl auszuführen, und ich habe a gedrückt Haken Sie sich mit den Backticks.

Die Generic_Sniffs_Php_forbiddenFunctionsSniff -Klasse, die mit der CodesNiffere 1.3 -Verteilung geliefert wird, macht es im Wesentlichen trivial, alle Anrufe an eine "gefährliche Funktion" wie exec (), popen () und passthru () zu identifizieren, damit dieser Teil einfach ist.

Aber ich kann weder Referenzen auf Backtick -Betreiber in den "Stock" -Schniffs sehen, und ich sehe auch keine Erwähnung des Backtick -Operator Finden Sie heraus, dass "->" zum Beispiel wirklich t_object_operator ist).

Meine Frage ist also:

Kann ich PHP_CODESNIFFER verwenden, um den Back -Tick -Operator -Gebrauch im PHP -Code zu erkennen, und wenn ja, wie?

War es hilfreich?

Lösung 2

Dieses Beispiel (mit den meisten Kommentaren, die ausgestrebt wurden) funktioniert mit einigen einfachen Testfällen - keine CodesNiffer -Änderungen erforderlich!

class test_Sniffs_Dangerous_BackTickSniff implements PHP_CodeSniffer_Sniff {

public $supportedTokenizers = array('PHP');

public function register() {
    return array(T_NONE);
}

public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) {
    // generate one error for every pair of backticks:
    static $reported = array();

    $all_tokens = $phpcsFile->getTokens();

    if ($all_tokens[$stackPtr]['content'] == '`') {
        $lno = $all_tokens[$stackPtr]['line'];
        if (!isset($reported[$lno])) {
            $reported[$lno] = true;
            $phpcsFile->addError('Avoid backticks', $stackPtr);
        }
    }
}

}

Da ich danach war, werde ich meine eigene Frage beantworten. Vielen Dank an Corbin und Ircmaxell für Ihre Kommentare.

Andere Tipps

http://php.net/manual/en/tokens.php

Sieht so aus, als gäbe es kein Token für Backticks. Sie sollten jedoch in der Lage sein, der Klassenhierarchie niedrig zu folgen, dass Sie einen Verbindungspunkt finden, an dem Sie nur Strpos oder PREG_MATCH durchführen können, um nach "zu suchen. In der CodesNiffiffer -Dokumentation sollte dies erwähnt werden, wie es geht, oder wie ich bereits sagte, können Sie der Klasse generic_sniffs_php_forbiddenfunctionssniff nach seinen übergeordneten (und bis zu seinem Elternteil) folgen, bis Sie feststellen, wo die tatsächliche Suche stattfindet.

Bearbeiten: Schauen Sie sich gerade den CodesNiffer -Code an, und es scheint, dass es möglicherweise nur die Suche nach Token unterstützt ... also sieht es so aus, als müssten Sie ein neues Token erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top