Лучший подход для разбора SQL в файлах PHP? - PullRequest
1 голос
/ 21 августа 2008

Для моей старшей диссертации я разработал программу, которая будет автоматически обнаруживать и предлагать исправления уязвимостей SQL-инъекций, используя подготовленные операторы. В частности, расширение mysqli для PHP. Мой вопрос к SO-сообществу таков: каким будет ваш предпочтительный подход для обнаружения исходного кода SQL в PHP?

Я использовал перечисление, связанное с SQL keywords (SELECT, INSERT, ...), и в основном анализировал каждую строку, перебирая перечисление, чтобы определить, присутствовал ли какой-либо SQL. Кроме того, я должен был убедиться, что анализатор не обнаружил ошибочно html (например, <\ select>).

Для меня это решение работало нормально, но теперь у меня есть немного больше времени в моих руках и я подумал о рефакторинге кода, чтобы использовать более элегантное (и эффективное) решение. Пожалуйста, ограничьте ваши решения использованием C # , так как это то, для чего я написал свою программу.

Ответы [ 6 ]

1 голос
/ 21 августа 2008

Я бы сказал, что было бы лучше искать вызовы функций, а не сам SQL. Возможно, измените синтаксический анализатор PHP для поиска вызовов функций, которые приводят к выполнению запроса SQL, который не является подготовленным запросом.

1 голос
/ 21 августа 2008

Я не знаю специфики переменных в C #, поэтому вам придется простить или опровергнуть меня за использование PHP, но в 70% случаев мой SQL-запрос переходит в переменную, например

$sql = "SELECT * FROM table;";

Кроме того, я не могу придумать, что вы можете сделать, чтобы улучшить то, что у вас уже есть.

Принимаете ли вы во внимание операторы, созданные в несколько строк, и используете переменные внутри строки? (Пример ниже)

$sql = "SELECT * FROM table WHERE fname = $fname OR snmae = $sname";
1 голос
/ 21 августа 2008

Может быть, есть небольшая разница в разборе текстовых строк против BNF для, скажем, SQL92 и оценке каждой строки на то, насколько фрагменты соответствуют грамматике.

Звучит как тяжелый подъем. Ваш простой подход уже поймает такой большой процент реальных случаев.

1 голос
/ 21 августа 2008

Ваше решение мне подходит. Другим способом было бы проанализировать PHP-файл с помощью синтаксического анализатора Lex / Yacc, используя грамматику для PHP, есть один хороший инструмент синтаксического анализа C #, называемый Coco / R http://www.ssw.uni -linz.ac.at / кокос / .

Однако, я полагаю, что если вы проанализируете язык, вы потратите слишком много времени (на разработку и вычисления) без каких-либо дополнительных результатов.

Я бы придерживался вашего оппортунистического подхода, но протестировал его на различный PHP-код и настроил его на все возможные случаи.

0 голосов
/ 21 августа 2008

Простое регулярное выражение для обнаружения всех операторов CRUD sql, используемых с функциями (при условии, что $ script содержит весь скрипт php)

preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?\)\s*?;/is', 
               $script, $matches);

Он должен соответствовать всем возможным операторам SELECT, INSERT, UPDATE, DELETE, если они помещены в круглые скобки и двойные кавычки. Он не учитывает регистр и должен соответствовать операторам, которые также охватывают несколько строк.

edit # 1: Regex для сопоставления оператора CRUD, такого как строковые назначения;

preg_match_all('/\$\w+\s*?=\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?"\s*?;/is', 
               $script, $matches);

edit # 2:

// $variable detecting version of #1 regex
preg_match_all('/\(\s*?"(?:SELECT|INSERT|UPDATE|DELETE) .*?(?:\$\w+){1}.*?"\s*?\)\s*?;/is', 
                   $script, $matches);
0 голосов
/ 21 августа 2008

Я не знаю специфику переменных в C #, поэтому вам придется простить или проголосовать за меня за использование PHP, но 70% времени мой SQL-запрос переходит в переменную, как это ..

Да, мой первоначальный подход состоял в том, чтобы просто искать переменные $ sql, поскольку именно это большинство людей используют, но после тестирования нескольких PHP-приложений я быстро выбросил это решение, потому что некоторые разработчики используют некоторые Прикольные имена переменных ...

Принимаете ли вы во внимание операторы, созданные в несколько строк, и используете переменные внутри строки? (Пример ниже)

Да. Я также попытался обработать операторы, которые были сгенерированы условно, но это не всегда работало так хорошо. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...