2013-03-07 5 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 Line 1. TODO и безопасности в одном комментарий
  2. FLAG Line 7. TODO и ошибка в одной строке комментария
  3. FLAG Line 11 & 12, потому что он получил TODO и безопасность в том же блоке комментариев, т.е. до фактической строки кода.
  4. FLAG Line 3, потому что он упоминает CVE.
  5. IGNORE Line 15, потому что он кажется манекеном TODO и, следовательно, является шумом.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Я знаю, что нет никакого одного регулярного выражения MAGIC, которое может полностью оттянуть его, но я ищу, чтобы как можно ближе.

Спасибо!

+0

Жесткая проблема, которую вы получили там. – alestanis

+0

Touche! Но тот, который, если его решить, может оказаться ценным для людей во всей индустрии безопасности. Это печальная реальность, что современные инструменты статического анализа плохо работают на отделение пшеницы от мякины. – raTM

+1

Ну, проблема может быть решена, конечно, но IMHO не с регулярными выражениями. Есть уже инструменты, которые делают разбор кода (думают о doxygen) и разделяют то, что в комментариях (что уже не так-то просто). Если у вас есть содержание вашего комментария, вы можете сделать некоторые [NLP] (http://en.wikipedia.org/wiki/Natural_language_processing), может быть? Или просто найдите ключевые слова, как вы предлагаете – alestanis

ответ

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

+0

@raTM Nope, без группировки; просто два выражения с чередованием '|', что означает либо соответствие комментария строки, либо комментария блока. –

Смежные вопросы