2013-03-07 81 views
3

我正在尝试编写一个能够识别易受攻击代码块的正则表达式。代码中经常被忽略的典型位置是代码中的TODO,FIXME,CVE和BUG注释。正则表达式匹配来识别易受攻击代码

在应用程序上执行安全代码审查时,我的目标是使用合适的正则表达式在注释中优化“相关”TODO和FIXME和BUG声明的结果。

也许我试图瞄准这个宠物项目太大。然后再次,这是堆栈溢出。如果某人在这里不知道答案,那么很有可能,没有人会(尚)。

样例文本


1. //TODO - autogenerated catch block. This could be a security flaw 
2. 
3. // But this could be a CVE also. 
4. 
5. String val = "empty"; 
6. /* 
7. * TODO bug fix later 
8. * Fixme although it probably does not need it 
9. */ 
10. 
11. //TODO autogenerated 
12. //security problem. Too hard to fix 
13. Integer int4 = 1; 
14. Object o = null; 
15. //TODO dummy block 

这里就是我希望的。我想正则表达式:

  1. FLAG 1号线在单个注释TODO和安全
  2. FLAG线7 TODO和bug单注释行
  3. FLAG线11 & 12,因为它有TODO和安全在相同的评论块中,即在实际的代码行之前。
  4. FLAG第3行,因为它提到了CVE。
  5. IGNORE 15号线,因为它似乎是一个虚拟的TODO,因此是噪音。

免责声明 - 我知道没有一个统一的MAGIC正则表达式,可以完全退出这个功能,但我希望得到尽可能接近。

谢谢!

+0

你遇到了难题。 – alestanis 2013-03-07 22:46:35

+0

谢谢!但是如果解决了这个问题,那么对于安全行业中的所有人来说都是有价值的。这是一个不幸的现实,现在的静态分析工具在分离小麦和谷壳方面做得不好。 – raTM 2013-03-07 22:51:23

+1

那么,这个问题当然可以解决,但恕我直言不与正则表达式。已经有一些工具可以进行代码解析(考虑doxygen),并将注释中的内容分开(这已经不是那么容易了)。一旦你有评论的内容,你可以做一些[NLP](http://en.wikipedia.org/wiki/Natural_language_processing)?或者只是寻找关键词,因为你建议 – alestanis 2013-03-07 22:56:49

回答

2

的事实,显示的逻辑是所有基于评论去,至少应该轻移你破译密码向下的方向:

preg_match_all('#// .* | /[*] [\s\S]*? [*]/#x', 
    $body, $matches, PREG_OFFSET_CAPTURE 
); 

这将匹配所有的意见,并在那里出现;它匹配内部字符串以及虽然,这只是其中的一个东西;-)

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [0] => //TODO - autogenerated catch block. This could be a security flaw 
        [1] => 3 
       ) 

      [1] => Array 
       (
        [0] => // But this could be a CVE also. 
        [1] => 76 
       ) 

      [2] => Array 
       (
        [0] => /* 
7. * TODO bug fix later 
8. * Fixme although it probably does not need it 
9. */ 
        [1] => 141 
       ) 

      [3] => Array 
       (
        [0] => //TODO autogenerated 
        [1] => 232 
       ) 

      [4] => Array 
       (
        [0] => //security problem. Too hard to fix 
        [1] => 257 
       ) 

      [5] => Array 
       (
        [0] => //TODO dummy block 
        [1] => 340 
       ) 

     ) 

) 
+0

谢谢@Jack - 绝对让我想到那个。非常感激。不太熟悉正则表达式原语,但是用于分析和组织匹配的分组? – raTM 2013-03-08 03:30:32

+0

@raTM没有,没有分组;只有两个表达式用'|'替代,意思是匹配行注释或块注释。 – 2013-03-08 03:35:07