Как поймать использование оператора PHP через PHP_CODESNIFFER?
-
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, и кажется, что он может поддержать только поиск токенов ... так что, похоже, вам придется сделать новый токен.