Написать пост

Как защитить свой Python-код

Аватарка пользователя Елена Капаца

Описали четыре техники увеличения безопасности кода и подобрали примеры к каждой из них. В статье вы познакомитесь не только с универсальными приемами, но и специфическими – для серверов и ботов.

Обложка поста Как защитить свой Python-код

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

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

Валидируйте входные данные

Стоит фильтровать пользовательский ввод на наличие определенных символов. В разработке веб-приложений это особенно важно, потому что помогает предотвратить различные атаки, такие как SQL-инъекции и межсайтовый скриптинг (XSS).

Покажу на примере.

Код ниже запускает простой веб-сервер, который при обработке GET-запроса возвращает HTML, вставляя имя сайта в приветствие:

			from http.server import HTTPServer, BaseHTTPRequestHandler
secret = 'abc123'
class Handler(BaseHTTPRequestHandler):
    name = 'xakep'
    msg = 'welcome to {site.name}'
    def do_GET(self):
        res = ('<title>' + self.path + '</title>\n' + self.msg).
format(site=self)
        self.send_response(200)
        self.send_header('content-type', 'text/html')
        self.end_headers()
        self.wfile.write(res.encode())
HTTPServer(('localhost', 8888), Handler).serve_forever()
		

Однако атакующий обращается к серверу и получает ключ secret, который хранится, казалось бы, в приватном репозитории:

			curl -g 'http://localhost:8888/XXX{site.do_GET.__globals__[secret]}
		

Это происходит из-за того, что self.path контролируется конечным пользователем.

Для решения проблемы подойдут f-строки. Они безопасны и работают быстрее, да и код выглядит куда опрятнее:

			res = f"<title>{self.path}\n{self.msg}"
		

Не всегда удается избежать спецсимволов в пользовательских данных. Для таких ситуаций придумали библиотеку bleach. Она может удалять нежелательные или потенциально вредоносные теги и атрибуты:

			import bleach

user_input = "<script>alert('XSS attack');</script>"
cleaned_input = bleach.clean(user_input)
print(cleaned_input)
		

Управляйте сессиями

Во время сессии всем событиям, помимо прочих метаданных, присваевается и идентификатор. Это позволяет сохранять данные между запросами, которые растянуты по времени.

Но злоумышленники могут угнать и перехватить cookies. Чтобы этого не произошло::

  1. Установите флаги Secure и HttpOnly. Первый передает только через HTTPS, второй запрещает доступ через JavaScript, что не дает внедрить скрипты
			from flask import session, Flask
app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_SECURE=True,
    SESSION_COOKIE_HTTPONLY=True,
    SESSION_COOKIE_SAMESITE='Lax',
)
		
  1. Регенерируйте идентификатор сессии при каждом входе и выходе пользователя из системы:
			@app.route('/login', methods=['POST'])
def login():
    # Проверка учетных данных
    # ...
    # Регенерация ID
    session.regenerate()
    return "Успешный вход в систему!
		
  1. Устанавливайте тайм-аут сессии:
			app.permanent_session_lifetime = timedelta(minutes=15)
		

Используйте виртуальное окружение

Виртуальное окружение (virtual environment) — надстройка, которая обеспечивает две вещи.

  • Изоляцию зависимостей. У каждого окружения будет собственный набор библиотек, изолированный от системного языкового пакета. Это гарантирует, что уязвимости в последних не навредят проекту.
  • Контроль версий. Виртуальное окружение позволит зафиксировать разновидность используемых библиотек с помощью requirements.txt или другого файла конфигурации. Код, скопированный из многолетнего треда на StackOverflow, часто выдает ошибку именно из-за этого. Если вы работаете с несколькими проектами, требующими разных версий одной и той же библиотеки, virtualenv поможет их «развести по углам».

Чтобы создать виртуальное окружение, используйте библиотеку virtualenv и команду:

			python<версия> -m venv <название виртуального окружения>
		

Чтобы освоить установку утилиты, вход в среду и другие полезные команды, обратитесь к англоязычной статье на freecodecamp.org.

Скачивайте только проверенные модули

Сообщество Python отлично справляется с написанием модулей под разные задачи: от генерации игрушечных данных до внедрения GPT на сайт. В 99% случаев найти готовое решение на PyPi + GitHub вы сможете.

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

Заключение

Техник защиты кода существует еще немало, я перечислила основные, которые встречаются в моей работе при создании ботов и дата-аналитике. Как только вы почувствуете свободу в написании кода, сразу же используйте накопленный предшественниками опыт, чтобы проект реализовался с меньшим количеством проблем.

Какие еще техники защиты кода вы используете? Поделитесь в комментариях

Следите за новыми постами
Следите за новыми постами по любимым темам
503 открытий2К показов