【问题标题】:Find whitespace-injecting PHP files查找注入空格的 PHP 文件
【发布时间】:2012-09-07 02:19:10
【问题描述】:

PHP 文件中的空格有时会出现问题,因此我试图找到符合常见问题标准的文件。我正在尝试以递归方式查找具有以下一种或两种条件的所有文件:

1) 不以 <# 字符开头。

和/或

2) 不以> 字符结尾,除非它以紧跟大括号且后跟任意数量的换行符结尾。

我认为第一个条件是:$[^<#]

我认为第二个条件是:[ [^>^] | [}\n*^]]

但是,请注意,在我幼稚的正则表达式中,$^ 代表文件的开始和结束,而不是文件中的任何行。即使有了这些,假设它们是正确的,我将如何组合它们?像这样?

[$[^<#]] | [[ [^>^] | [}\n*^]]]

然后,将它们放入 grep:

grep -r [$[^<#]] | [[ [^>^] | [}\n*^]]] *

显然,这是行不通的 (tm)。有人可以教我如何纠正错误吗?谢谢。

这是一个很好的文件:

<?php

?>

是这样的:

<?php
function someFunc(){
}


‏

这也很好:

#!/usr/bin/php -q
<?php
?>

前导 HTML 很好:

<html>
<?php
echo '</html>';
?>

尾随 HTML 也可以:

<?php
echo '<html>';
?>
</html>

这很糟糕(领先的换行符):

‏
<?php

?>

这也很糟糕(前导空格):

‏ <?php

?>

这也很糟糕(尾随换行符):

<?php

?>
‏

【问题讨论】:

  • 避免此问题的最简单方法之一是不在文件末尾包含结束 ?&gt;。这是有效的 PHP,并且包含在许多主流 PHP 编码标准中,包括 PEAR 编码标准。以?&gt; 结尾的文件是自找麻烦。
  • 您可能会考虑的一个想法:打开输出缓冲,include() 文件,并查看包含它时它生成的输出是否有前导/尾随空格。
  • 您可以使用phptags --warn *.php
  • 两件事:你必须使用-E grep(或 egrep)选项来打开高级正则表达式。第二个:^ 是开头,$ 是一行的结尾,而不是相反。

标签: php regex bash grep


【解决方案1】:

很快就提出了一个我认为符合你要求的表达方式。这里已经很晚了,出于某种原因,我在 stackoverflow 上。无论如何,我希望我得到了您的要求。

试试这个正则表达式/\A(?:\s+.*&gt;|[^&lt;#].*&gt;\s*|&lt;.*&gt;\s+)\Z/s。在这里解释:http://regex101.com/r/cT7eY5

我希望这会有所帮助。如果我对您有任何误解,请澄清,我会尝试调整表达方式。

【讨论】:

  • 谢谢。它确实需要做很多工作,但这让我朝着正确的方向前进。这里也晚了!
  • 我忘记了 s-flag 是这个表达式工作所必需的。如果您以前不使用它,请确保现在就使用它。
  • 谢谢林德里安。回到这一点,在我看来,\A 与我的 grep 版本(Debian 派生发行版上的 2.9)中文件的开头不匹配。 \A 实际上是否匹配系统上文件的开头?哪个系统?谢谢。
  • 看来grep -rE "/\A(?:\s+.*&gt;|[^&lt;#].*&gt;\s*|&lt;.*&gt;\s+)\Z/s" 挂了。我运行正则表达式是否错误?
猜你喜欢
  • 2012-09-20
  • 2013-04-17
  • 2017-10-18
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
相关资源
最近更新 更多