1

我从CodeSniffer 1.3 版附带的“Generic”和“Squiz”编码标准中研究了一些“嗅探” ,并学会了编写一些“自定义”嗅探来捕捉一些特定于 PHP 的编码反模式我正在做的项目。

但是现在我的老板要我使用该工具来识别代码调用 exec()、popen()、passthru() 或使用反引号运算符运行“外部”命令的所有地方,我已经打了一个处理反引号的障碍。

CodeSniffer 1.3 发行版附带的 Generic_Sniffs_PHP_ForbiddenFunctionsSniff 类使得识别对 exec()、popen() 和 passthru() 等“危险函数”的任何调用基本上是微不足道的,因此这部分很容易。

但是我在“股票”嗅探中看不到任何对反引号运算符的引用,也没有在任何 CodeSniffer 逻辑本身中看到任何对反引号运算符的提及——尽管我可能找错了地方(我花了一段时间才例如,找出“->”实际上是 T_OBJECT_OPERATOR)。

所以我的问题是:

我可以使用 PHP_CodeSniffer 来检测 PHP 代码中反引号运算符的使用,如果可以,如何?

4

2 回答 2

2

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

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

编辑:刚刚查看了 CodeSniffer 代码,它似乎只支持令牌搜索......所以看起来你必须制作一个新的令牌。

于 2011-09-06T23:29:55.783 回答
1

这个例子(去掉了大部分注释)适用于一些简单的测试用例——不需要对 CodeSniffer 进行更改!

类 test_Sniffs_Dangerous_BackTickSniff 实现 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 的评论。

于 2011-09-07T02:11:17.640 回答