Pregunta

He estudiado algunos "sniffs" de los estándares de codificación "genéricos" y "squiz" que vienen con Codesniffer versión 1.3, y aprendí lo suficiente como para escribir algunos olfates "personalizados" para atrapar algunos antipatrones de codificación que son específicos de un proyecto de PHP en el que estoy trabajando.

Pero ahora mi jefe quiere que use la herramienta para identificar todos los lugares donde el código llama exec (), popen (), passthru () o usa el operador de retroceso para ejecutar un comando "externo", y he presionado un enganchar a los backticks.

La clase Generic_Sniffs_Php_ForbidDenFunctionsSniff que viene con la distribución Codesniffer 1.3 hace que sea esencialmente trivial identificar cualquier llamada a una "función peligrosa" como Exec (), Popen () y Passthru (), por lo que esa parte es fácil.

Pero no puedo ver ninguna referencia a los operadores de retroceso en los olfates de "stock", ni veo ninguna mención del operador de retroceso en ninguna de las codificadoras de la lógica en sí, aunque puedo estar buscando en el lugar equivocado (me llevó un tiempo a Calcule que "->" es realmente t_object_operator, por ejemplo).

Así que mi pregunta es esta:

¿Puedo usar PHP_CODESNIFFER para detectar el uso del operador de retroceso en el código PHP y, de ser así, cómo?

¿Fue útil?

Solución 2

Este ejemplo (con la mayoría de los comentarios despojados) funciona con algunos casos de prueba simples: ¡no se requieren cambios de Codesniffer!

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);
        }
    }
}

}

Como esto es lo que buscaba, voy a responder a mi propia pregunta. Gracias Corbin e Ircmaxell, por sus comentarios.

Otros consejos

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

Parece que no hay token para backticks. Sin embargo, debe poder seguir la jerarquía de clase lo suficientemente hacia abajo para encontrar un punto de conexión donde pueda hacer STRpos o PreG_Match buscando `. Debería mencionar en la documentación de Codesniffer cómo hacer eso, o, como dije, podría seguir la clase Generic_Sniffs_Php_ForbiddenFunctionsSniff hasta su padre (y hasta su padre si es necesario) hasta que encuentre dónde está ocurriendo la búsqueda real.

Editar: solo busqué en el código Codesniffer, y parece que solo puede admitir la búsqueda de tokens ... por lo que parece que tendrá que hacer un nuevo token.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top