Пользовательский ввод в Python - пользовательский ввод в Python - как получить пользовательский ввод в Python

Неправильный способ получения пользовательского ввода в Python (и безопасная альтернатива)

После появления Вход() Все идет не так

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

Проблема с пользовательский ввод() Питон

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

⚠️ Только образовательный пример, не функциональный и не предназначенный для использования

Если вам интересно, как безопасно получить пользовательский ввод в Python, ответ прост: никогда не доверяйте ему слепо.

Риски и безопасное обращение в DevSecOps Pipelines

Небезопасный пользовательский ввод Python может проникнуть в разные этапы жизненного цикла программного обеспечения:

  • CI/CD скрипты которые развертывают или создают артефакты
  • Внутренние инструменты разработчика контролирующие среды
  • Сторонние интеграции которые предполагают, что входные данные безопасны.

Если зависимость обрабатывает пользовательский ввод Python без проверки, вы наследуете этот риск, даже если ваш код безопасен. Именно поэтому проверка должна применяться единообразно во всем коде. pipeline.

Пример pipeline риск:

превентивный CI/CD обеспечение соблюдения:

Ключ на вынос: Знание того, как безопасно получить пользовательский ввод в Python, — это только половина дела; автоматизированное обеспечение обеспечивает небезопасный код никогда не попадает в производство.

Распространенные векторы атак

Небезопасный пользовательский ввод данных в Python может привести не только к появлению «плохих данных». К распространённым рискам относятся:

  • Внедрение команд, передавая контролируемые пользователем данные системным командам
  • Ввод кода: выполнение динамически сгенерированного кода из входных данных

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

Если вы полагаетесь на необработанный пользовательский ввод Python, вы передаете управление пользователю или злоумышленнику.

Безопасная альтернатива: проверка и очистка входных данных

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

Самый безопасный подход к получению пользовательского ввода в Python заключается в следующем:

  • Обеспечить проверку типов
  • Применить белые списки для разрешенных значений
  • Используйте безопасные библиотеки анализа, такие как argparse и пидантический.

Быстрое сравнение

Сценарий Небезопасный пример Безопасный пример
Прямое использование input()
  # ⚠️ Educational example only  user_name = input("Enter username: ")  simulate_process(user_name)          
  import argparse  parser = argparse.ArgumentParser()  parser.add_argument("--username", type=str)  args = parser.parse_args()  process(args.username)          
Структурированная проверка
  # ⚠️ Educational example only  age = input("Enter your age: ")          
  from pydantic import BaseModel, ValidationError  class UserInput(BaseModel):      age: int  try:      data = UserInput(age=int(input("Enter your age: ")))  except ValidationError as e:      print("Invalid input:", e)          

Лучшие практики пользовательского ввода Python:

  • Преобразование типов и обработка ошибок (попробовать / кроме)
  • Применить белые списки для известных значений
  • Используйте argparse для CLI и пидантический для структурированных данных

Обнаружение небезопасного ввода и применение мер безопасности CI/CD с Ксигени

Для выявления всех небезопасных пользовательских данных Python вручную проверить недостаточно; ключевую роль играет автоматизация. Такие инструменты, как Ксигени Сканировать репозитории на наличие шаблонов Python, вводимых пользователем, без их очистки. При интеграции в CI/CD, они не проходят проверку безопасности, если обнаружена небезопасная обработка входных данных. Это блокирует слияние с защищёнными ветками до тех пор, пока проблема не будет устранена.

Сценарий Небезопасный пример Безопасный пример
Прямое использование input()
  # ⚠️ Educational example only — not functional  name = input("Enter username: ")  simulate_process(name)  # Simulated for demonstration          
  import argparse  parser = argparse.ArgumentParser()  parser.add_argument("--username", type=str)  args = parser.parse_args()  process(args.username)  # Validated by argparse          
Структурированная проверка
  # ⚠️ Educational example only — not functional  age = input("Enter your age: ")          
  from pydantic import BaseModel, ValidationError    class UserInput(BaseModel):      age: int    try:      data = UserInput(age=int(input("Enter your age: ")))  except ValidationError as e:      print("Invalid input:", e)          
CI/CD принуждение
  # Missing automated checks allows  # unsafe input patterns to slip in  # during reviews/merges.          
  jobs:    security_scan:      runs-on: ubuntu-latest      steps:        - uses: actions/checkout@v3        - name: Run Xygeni Scan          run: xygeni scan \            --rules detect-unsafe-input \            --fail-on-findings          

Вот как это работает:

  1. Xygeni сканирует на наличие небезопасного пользовательского ввода Python.
  2. Если найден, возвращается ненулевой код выхода.
  3. CI/CD отмечает задание как проваленное.
  4. Защита ветвей блокирует слияние до тех пор, пока проблема не будет устранена.

Это обеспечивает безопасный и автоматический доступ к пользовательскому вводу в Python.

Финальные выносы

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

План действий:

  • Проверить с самого начала:  применять преобразование типов, белые списки и библиотеки, такие как argparse or пидантический перед обработкой пользовательского ввода Python.
  • Автоматическое обнаружение:  конфигурировать pipelines для блокировки слияний при обнаружении небезопасных шаблонов.
  • Обеспечение соблюдения правил с помощью ворот безопасности:  интегрировать инструменты, такие как Xygeni для автоматическая блокировка в защищенных ветвях.
  • Обучайте свою команду:  убедиться, что все знают, как безопасно получать пользовательский ввод в Python, и понимают риски пропуска проверки.

Безопасность приложений не начинается в процессе производства; он запускается с момента написания первой строки кода. Сделайте безопасную обработку ввода функцией по умолчанию.

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni