Рассмотрим следующий фрагмент кода:
import MySQLdb
def get_data(id):
db = MySQLdb.connect(db='TEST')
cursor = db.cursor()
cursor.execute("SELECT * FROM TEST WHERE ID = '%s'" % id)
return cursor.fetchall()
print(get_data(1))
В коде есть серьезная проблема - он уязвим для атак SQL-инъекций, поскольку запрос не параметризируется через API БД и построен с помощью форматирования строк. Если вы вызываете функцию следующим образом:
get_data("'; DROP TABLE TEST -- ")
будет выполнен следующий запрос:
SELECT * FROM TEST WHERE ID = ''; DROP TABLE TEST --
Теперь моя цель - проанализировать код в проекте и обнаружить все места, потенциально уязвимые для инъекций SQL. Другими словами, когда запрос строится с помощью форматирования строк, в отличие от передачи параметров запроса в отдельном аргументе.
Это то, что можно решить статически, с помощью pylint
, pyflakes
или любых других пакетов статического анализа кода?
Я знаю sqlmap
популярный инструмент тестирования проникновения, но, насколько я понимаю, он работает против веб-ресурса, тестируя его как черный ящик через HTTP-запросы.