Перейти к содержимому

Как выявить слабости исходного кода python

  • автор:

Устройство интерпретатора языка Python

Основная реализация языка Python пока что не имеет оптимизирующего компилятора, поэтому разговор об оптимизации касается только оптимизации кода самим программистом. В любом языке программирования имеются свои характерные приемы оптимизации кода. Оптимизация ( улучшение ) кода может происходить в двух (зачастую конкурирующих) направлениях: скорость и занимаемая память . В условиях достатка оперативной памяти приложения обычно оптимизируют по скорости. При оптимизации по времени программы для одноразового вычисления следует иметь в виду, что в общее время решения задачи входит не только выполнение программы, но и время ее написания. Не стоит тратить усилия на оптимизацию программы , если она будет использоваться очень редко.

Следует учитывать, что программа , реализующая некоторый алгоритм , не может быть оптимизирована до бесконечно малого времени вычисления: используемый алгоритм имеет определенную временную сложность и программу, основанную на слишком сложном алгоритме, существенно оптимизировать не удастся. Можно попытаться сменить алгоритм (хотя многие задачи этого сделать не позволяют) или ослабить требования к решениям. Иногда помогает упрощение алгоритма. К сожалению, оптимизация кода, как и программирование — задача неформальная, поэтому умение оптимизировать код приходит с опытом.

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

Собственно, в данном примере для модуля timeit уже показан практический способ нахождения оптимального кода. Стоит также отметить, что с помощью профайлера нужно определить места кода, отнимающие наибольшую часть времени. Обычно это действия, выполняемые в самом вложенном цикле. Можно попытаться вынести из цикла все, что можно вычислить в более внешнем цикле или вообще вне цикла .

В языке Python вызов функции является относительно дорогостоящей операцией, поэтому на критичных по скорости участках кода следует избегать вызова большого числа функций.

В некоторых случаях работу программы на Python можно ускорить в несколько раз с помощью специального оптимизатора (он не входит в стандартную поставку Python , но свободно распространяется): psyco . Для ускорения программы достаточно добавить следующие строки в начале главного модуля программы:

import psyco psyco.full()

Правда, некоторые функции не поддаются «компиляции» с помощью psyco . В этих случаях будут выданы предупреждения. Посмотрите документацию по psyco с тем, чтобы узнать ограничения в его использовании и способы их преодоления.

Еще одним вариантом ускорения работы приложения является переписывание критических участков алгоритма на языках более низкого уровня (С/С++) и использование модулей расширения из Python . Однако эта крайняя мера обычно не требуется или модули для задач, требующих большей эффективности, уже написаны. Например, для работы с растровыми изображениями имеется прекрасная библиотека модулей PIL ( Python Imaging Library ). Численные расчеты можно выполнять с помощью пакета Numeric и т.д.

Pychecker

Одним из наиболее интересных инструментов для анализа исходного кода Python программы является Pychecker. Как и lint для языка C, Pychecker позволяет выявлять слабости в исходном коде на языке Python. Можно рассмотреть следующий пример с использованием Pychecker:

import re, string import re a = "a b c" def test(x, y): from string import split a = "x y z" print split(a) + x test(['d'], 'e')

Pychecker выдаст следующие предупреждения:

badcode.py:1: Imported module (string) not used badcode.py:2: Imported module (re) not used badcode.py:2: Module (re) re-imported badcode.py:5: Parameter (y) not used badcode.py:6: Using import and from . import for (string) badcode.py:7: Local variable (a) shadows global defined on line 3 badcode.py:8: Local variable (a) shadows global defined on line 3

В первой строке импортирован модуль, который далее не применяется, то же самое с модулем re . Кроме того, модуль re импортирован повторно. Другие проблемы с кодом: параметр y не использован; модуль string применен как в операторе import , так и во from-import ; локальная переменная a затеняет глобальную, которая определена в третьей строке.

Можно переписать этот пример так, чтобы Pychecker выдавал меньше предупреждений:

import string a = "a b c" def test(x, y): a1 = "x y z" print string.split(a1) + x test(['d'], 'e')

Теперь имеется лишь одно предупреждение:

goodcode.py:4: Parameter (y) not used

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

Получение исходного кода функции в Python

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

Алексей Кодов
Автор статьи
7 июля 2023 в 17:32

Часто возникает ситуация, когда необходимо получить исходный код функции в Python. Представим, что есть функция, которая выглядит следующим образом:

def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result

Можно получить имя функции, используя my_function.__name__ . Но что делать, если нужно получить исходный код этой функции? Для этого можно использовать модуль inspect из стандартной библиотеки Python.

Модуль inspect предоставляет несколько функций, которые помогают получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, кадры стека и объекты кода. Сюда входит и функция getsource() , которая возвращает текст исходного кода объекта.

Применение этой функции к примеру выше будет выглядеть следующим образом:

import inspect def my_function(arg1, arg2): # обработка аргументов result = arg1 + arg2 return result source_code = inspect.getsource(my_function) print(source_code)

После выполнения этого кода в консоли будет выведен исходный код функции my_function .

Таким образом, модуль inspect и его функция getsource() могут быть очень полезными, когда необходимо получить исходный код функции в Python. Однако стоит помнить, что это работает только для функций, определенных в исходном коде (не скомпилированных или встроенных), и код должен быть доступен.

Python проверка кода на безопасность

Python не первый год входит в Топ-4 языков программирования по популярности. Его используют для различных целей:

  • При автоматизации задач в системном администрировании.
  • В банковской сфере. Например, один из крупнейших банков России применяет его для управления своими банкоматами.
  • Во встроенных системах станков с ЧПУ.
  • В телекоммуникационном оборудовании.
  • При разработке мобильных приложений (преимущественно для серверной части).
  • В Data Science, при разработке облачных решений, в области машинного обучения, искусственного интеллекта.

Учитывая важность программного обеспечения и информационных систем, в которых применяется этот язык программирования, можно судить о том, насколько живой интерес проявляют к ним злоумышленники. Так что проверке безопасности Python и созданных с его помощью продуктов необходимо уделять должное внимание.

Методы и инструменты тестирования уязвимости Python

При анализе безопасности программ, написанных на этом языке, используются те же подходы и технологии, как и в случае с другими. Для тестирования безопасности программного обеспечения применяются методы:

  • DAST – динамическое тестирование методом черного ящика. Выявляет проблемы в работающем приложении – воздействуя на интерфейсы программы и анализируя ее реакцию на такие события. Для анализа уязвимости написанных на Python продуктов с помощью этого метода требуются специалисты в области тестирования на проникновение. Также необходимо развертывание отдельных сред для тестирования, что могут позволить себе далеко не все конечные пользователи программного обеспечения.
  • SAST – тестирование безопасности Python методом белого ящика. Для SAST-анализатора исходного кода не требуется запуск приложения. Кроме того, результаты работы этого инструмента представляются в удобном для восприятия виде: с ними может работать специалист, не имеющий опыта в разработке (офицер по информационной безопасности, системный администратор). Более того, SAST-инструменты могут использовать и конечные пользователи программ. Еще одно преимущество этот метода при тестировании уязвимости – проверка не только самой программы, но и сторонних компонентов и библиотек, что для этого языка программирования с присущим ему огромным количеством зависимостей весьма актуально.
  • IAST – интерактивное тестирование безопасности. В методе сочетаются черты двух предыдущих. за счет чего покрывается большее количество кода, выдаются более точные результаты, а также достигается ряд других преимуществ. Но чтобы использовать его, потребуется собственная команда разработчиков для интерпретации некоторых результатов, а также развертывание отдельных сред для тестирования.

SAST-тестирование безопасности Python

При разработке анализатора исходного кода Solar appScreener мы опирались на метод тестирования безопасности белого ящика, который могут использовать как разработчики программного обеспечения, так и пользователи.

Тестирование уязвимости с помощью SAST-инструментов позволяет выявлять как «универсальные», характерные для многих языков программирования уязвимости (например, места в коде, через которые возможны атаки с помощью инъекций или парсинг XML), так и специфичные. SAST-анализатор исходного кода находит конструкции, через которые может быть реализована угроза, и формирует оповещения об этом.

При проверке уязвимостей методом белого ящика выявляются слабые места в работе с вводимыми пользователями и принимаемыми от сторонних источников данными. SAST находит проблемы с авторизацией, работой с базами данных, сессиями и так далее. За счет покрытия почти 100% кода практически ни одна уязвимость не остается незамеченной.

Проверка безопасности Python с помощью SAST-анализаторов позволяет находить практически все типовые проблемы, характерные для этого языка. Среди них:

  • Уязвимости, связанные с использованием в процессе разработки старых версий языка и небезопасных конструкций, из-за чего существует вероятность реализации некоторых угроз. Пример – функция init() в Python 2.7, которая работает аналогично небезопасной eval в более новых версиях языка. Через нее возможно выполнение сторонних скриптов (которые могут быть вредоносными). Пример небезопасной конструкции – использование assert для защиты фрагментов кода, к которым не должны обращаться пользователи.
  • Публичное отображение ошибок. Это может отрицательно повлиять на безопасность приложения. SAST-инструмент может находить такие моменты (пример – значение true для debug при использовании Django), опираясь на стандартные или добавляемые пользователями правила.
  • Пакеты с вредоносным кодом в модулях и уязвимости, проблемы, связанные с импортированием. При разработке программного обеспечения на этом языке программирования может использоваться множество библиотек, устанавливающихся с помощью Pip. Инструменты статического анализа кода проверяют не только само приложение, но и подключаемые компоненты. Еще одна потенциальная угроза для программ на Python – использование относительных и неявных путей для импорта. Такие проблемы выявляются с помощью стандартных правил SAST-инструментов, а также правил, задаваемых пользователями.

Это лишь малая часть проблем, которые можно выявить в программах на Python при анализе исходного кода методом белого ящика. Возможности современных SAST-анализаторов позволяют находить довольно сложные уязвимости, на поиск которых другими методами ушло бы немало времени. И еще один весомый плюс таких инструментов – возможность применения SAST-анализа на всех этапах жизненного цикла программного обеспечения, включая стадию его эксплуатации конечными пользователями.

Как выявить слабости исходного кода python

Комментарии

Популярные По порядку
Не удалось загрузить комментарии.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе лежит объектный подход, поэтому работать в стиле ООП на Python очень просто.

3 самых важных сферы применения Python: возможности языка

Существует множество областей применения Python, но в некоторых он особенно хорош. Разбираемся, что же можно делать на этом ЯП.

Программирование на Python: от новичка до профессионала

Пошаговая инструкция для всех, кто хочет изучить программирование на Python (или программирование вообще), но не знает, куда сделать первый шаг.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *