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

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

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

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

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

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

python
user_command = input("Enter command: ")
simulate_system_call(user_command)  # Simulated function for demonstration

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

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

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

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

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

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

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

python
# ⚠️ Educational example only — not functional
env_target = input("Enter deployment environment: ")
simulate_deploy(env_target)  # Simulated for demonstration

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

yaml
stages:
  - validate
validate_input:
  script:
    - python scripts/check_input_safety.py
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: never

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

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

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

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

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

python
# ⚠️ Educational example only — not functional or exploitable
code_snippet = input("Provide code: ")
simulate_code_execution(code_snippet)  # Simulated evaluation for demonstration

Если вы полагаетесь на необработанный пользовательский ввод 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-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
7-дневная бесплатная пробная версия
Кредитная карта не требуется.

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

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