2016-05-08 4 views
1

У меня возникают проблемы с регулярными выражениями, используя Python 2.7, если это имеет значение.Regex захватывает вставленные переменные в выражениях строки PHP SQL

В основном то, что я пытаюсь сделать, это захватить вставленные переменные в строку запроса декларации PHP SQL, например:

$query = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';"; 

Это должно вернуть $user, когда я получаю вторую группу из матча.

Вот мое регулярное выражение, как он стоит прямо сейчас:

r'.*?\s*=\s*\(\".*?\'(\$[^\']+)\'.*?\"\);' 

Example showing that this works and captures $user but not the one above (yes I know it doesn't capture $pass as it ideally should, that's seems to be a limitation with Python's implementation and Regex in general. I do some hacks to get around this in my actual program)

Вышеперечисленные работы для примера я использовал. Однако, когда я представлю еще один случай, когда вставленные переменные использует синтаксис '{$foo['bar']}', мое другое регулярное выражение ниже не работает, которая учитывает тот факт, что она содержит апостроф, который не закрывает переменный:

r'.*?\s*=\s*[\(]?\".*?(?:(?:\'(\$[^\']+)\')|(?:\'(\$\{[^\}]+\})\'))?.*?\"[\)]?;' 

Так в основном я хочу захватить либо синтаксис '$user, либо файл с {}, например '{$foo['bar']}'. Обратите внимание, что это не эксклюзивно, просто вставленная переменная может быть любой, и я хочу учесть их.

Here's a link to test this out, showing that it doesn't work. Using the second regex also breaks capturing the simple $user, not sure why.

+0

Почему в мире вы хотите анализировать запрос mysql с помощью регулярного выражения? Надеюсь, это не защита от инъекций. – cb0

+0

Да, это своего рода. Это для школьного проекта, где мы хотим видеть, сколько кода GitHub не защищено, используя самые базовые средства защиты от инъекций PHP, такие как подготовленные операторы или экранированные строки. Поэтому нам нужно искать много кода, я думал, что regex - лучший вариант. – Jokab

+0

Этот звук интересный (классный школьный проект) еще довольно сложно. Regex действительно является одним из вариантов сделать это, но никогда не предложит полного решения. Для очень сложного кода невозможно определить поток управления программой. Таким образом, не может быть никакой реальной защиты, где выполняются запросы. Возможно, это уже произошло задолго до этого. Другим вариантом было бы создать дерево ада кода, это должно быть проще для поиска. Это целая куча работы, но может дать лучшие результаты, чем регулярное выражение. – cb0

ответ

1

Я не уверен, что вы имеете в виду ограничения в питоне, потому что следующие работы, как он должен:

>>> import re 
>>> query = "SELECT * FROM `users` WHERE user='$user' AND password='$pass';"; 
>>> re.findall(r"='(\$\w+)'", query) 
['$user', '$pass'] 

Для сравнения другого запроса посмотреть на этой regex demo:

='(\{?\$.+?)(?:'(?:\s|;)) 

И, код примера:

>>> query1 = "(\"SELECT table_schema, table_name, create_time FROM information_schema.tables WHERE table_schema='{$_DVWA['db_database']}' AND table_name='users' LIMIT 1\");" 
>>> re.findall(r"='(\{?\$.+?)(?:'(?:\s|;))", query1) 
["{$_DVWA['db_database']}"] 

# it works on the other query as well 
>>> re.findall(r"='(\{?\$.+?)(?:'(?:\s|;))", query) 
['$user', '$pass'] 
+0

О, я не знал об этой технике. Я думал, что только что возвратил объекты совпадения, что означало бы, что я должен был их снова искать. Благодаря! Однако он не отвечает на вопрос. – Jokab

+0

Работает удивительно. Благодаря! – Jokab

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