Как поймать использование оператора PHP через PHP_CODESNIFFER?

StackOverflow https://stackoverflow.com/questions/7327287

  •  27-10-2019
  •  | 
  •  

Вопрос

Я изучал некоторые «нюхания» из стандартов кодирования «общие» и «squiz», которые поставляются с Codesniffer Версия 1.3, и научился достаточно, чтобы написать несколько «пользовательских» нюшт, чтобы поймать некоторые кодирующие анти-паттерны, которые специфичны для проекта PHP, над которым я работаю.

Но теперь мой босс хочет, чтобы я использовал инструмент для определения всех мест, где кодовые вызовы exec (), popen (), passthru () или используют оператор обратной связи для запуска «внешней» команды, и я нажимал Загвоздка, имеющая дело с обратными тренажерными т. Д..

Класс generic_sniffs_php_forbiddenfunctionssniff, который поставляется с распределением Codesniffer 1.3, делает по существу тривиальным для определения любых вызовов «опасной функции», например, exec (), popen () и passthru (), так что эта часть легко.

Но я не вижу никаких ссылок на операторов обратной связи в «Стопках», и при этом я не вижу упоминания об операторе обратного. Выясните, что "->" действительно t_object_operator, например).

Итак, мой вопрос в следующем:

Могу ли я использовать PHP_CODESNIFFER для обнаружения использования оператора обратной связи в коде PHP, и если да, то как?

Это было полезно?

Решение 2

Этот пример (с большинством комментариев, разделенных) работает с несколькими простыми тестовыми случаями - никаких изменений 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);
        }
    }
}

}

Поскольку это то, что я был после, я собираюсь ответить на свой собственный вопрос. Спасибо Corbin и Ircmaxell, за ваши комментарии.

Другие советы

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

Похоже, нет токена для бэктиков. Вы должны, однако, иметь возможность следовать за иерархией классов достаточно низко вниз, чтобы найти точку подключения, где вы можете просто выполнить strpos или preg_match в поисках `. Он должен упомянуть в документации Codesniffer, как это сделать, или, как я уже сказал, вы можете следовать классу Generic_sniffs_php_forbiddenfunctionssniff до своего родителя (и до его родителя, если это необходимо), пока вы не найдете, где происходит фактический поиск.

РЕДАКТИРОВАТЬ: только что посмотрите в код CODESNIFFER, и кажется, что он может поддержать только поиск токенов ... так что, похоже, вам придется сделать новый токен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top