如何通过PHP_CodeSniffer捕获PHP反引号操作符?

时间:2011-09-06 23:24:42

标签: php backticks codesniffer

我从CodeSniffer version 1.3附带的“Generic”和“Squiz”编码标准中研究了一些“嗅探”,并学到了足够多的“定制”嗅探来捕捉一些编码反模式特定于我正在处理的PHP项目。

但是现在我的老板要我使用该工具来识别代码调用exec(),popen(),passthru()的所有位置,或者使用反引号运算符来运行“外部”命令,而我我遇到了反击的障碍。

CodeSniffer 1.3发行版附带的Generic_Sniffs_PHP_ForbiddenFunctionsSniff类使得识别对“危险函数”(如exec(),popen()和passthru())的任何调用都非常简单,因此该部分很容易。

但我在“stock”嗅探器中看不到任何对反引号操作符的引用,也没有在任何CodeSniffer逻辑本身中看到任何提示反引号操作符 - 虽然我可能在错误的地方查找(它花了我一段时间来弄清楚“ - >”实际上是T_OBJECT_OPERATOR,例如)。

所以我的问题是:

我是否可以使用PHP_CodeSniffer来检测PHP代码中的反引号操作符用法,如果是,如何?

2 个答案:

答案 0 :(得分:2)

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

看起来没有反引号的标记。但是,您应该能够遵循足够低的类层次结构,以便找到一个连接点,您可以在其中执行strpos或preg_match查找`。它应该在CodeSniffer文档中提到如何做到这一点,或者,就像我说的那样,你可以遵循Generic_Sniffs_PHP_ForbiddenFunctionsSniff类直到它的父级(如果需要,直到它的父级),直到找到实际搜索发生的位置。

编辑:只是查看了CodeSniffer代码,看起来它可能只支持令牌搜索......所以看起来你必须创建一个新令牌。

答案 1 :(得分:1)

此示例(删除了大多数注释)适用于一些简单的测试用例 - 无需更改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,感谢您的评论。