Как отловить использование оператора backtick в PHP через PHP_CodeSniffer? - PullRequest
1 голос
/ 07 сентября 2011

Я изучил некоторые "сниффы" из стандартов кодирования "Generic" и "Squiz", которые поставляются с CodeSniffer версии 1.3 , и научился достаточно писать несколько "пользовательских" сниффов, чтобы поймать некоторое кодированиеанти-паттерны, характерные для PHP-проекта, над которым я работаю.

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

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

Но я не вижу ссылок на операторы backtick в сниффе «stock»Также я не вижу упоминания оператора backtick в какой-либо самой логике CodeSniffer - хотя я могу искать не в том месте (потребовалосьпока, чтобы выяснить, что "->" действительно T_OBJECT_OPERATOR, например).

Так что мой вопрос таков:

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

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

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

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

Редактировать: только что заглянул в код CodeSniffer, и оказалось, что он может поддерживать только поиск токенов ... Похоже, вам придется создать новый токен.

1 голос
/ 07 сентября 2011

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

}

Как этопосле чего я собираюсь ответить на свой вопрос.Спасибо Корбину и ircmaxell за ваши комментарии.

...