Dane wejściowe użytkownika w Pythonie - dane wejściowe użytkownika w Pythonie - jak uzyskać dane wejściowe użytkownika w Pythonie

Niewłaściwy sposób pozyskiwania danych od użytkownika w Pythonie (i bezpieczna alternatywa)

Kiedy wejście() Idzie źle

Skrypt wdrożeniowy Pythona kiedyś zażądał polecenia konsoli. Jeden błędnie wpisany kod wywołał niewłaściwą operację i przerwał kompilację produkcyjną. To właśnie jest niebezpieczeństwo związane z wprowadzaniem danych przez użytkownika w Pythonie: pojedynczy niesprawdzony ciąg znaków może spowodować wstrzyknięcie danych, utratę danych lub obejście logiki. Wyjaśnijmy, dlaczego tak się dzieje i jak bezpiecznie obsługiwać wprowadzanie danych przez użytkownika w Pythonie, zarówno w projektach open source, jak i wewnętrznych.

Problem z dane wejściowe użytkownika() Python

wejście() Funkcja w Pythonie jest prosta: odczytuje tekst z konsoli i zwraca go jako ciąg znaków. Bez walidacji. Bez sprawdzania. W izolacji wydaje się to nieszkodliwe. Ale w scenariuszach produkcyjnych, CI/CD zadania i narzędzia automatyzacji, przesyłanie surowych danych wprowadzonych przez użytkownika w języku Python bezpośrednio do poleceń lub funkcji otwiera drzwi podatnościom.

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

				
			

⚠️ Tylko przykład edukacyjny, niefunkcjonalny ani niemożliwy do wykorzystania

Jeśli zastanawiasz się, jak bezpiecznie odczytywać dane wprowadzane przez użytkownika w Pythonie, odpowiedź jest prosta: nigdy nie ufaj im bezgranicznie.

Ryzyka i bezpieczne postępowanie w DevSecOps Pipelines

Niebezpieczne dane wprowadzane przez użytkownika Pythona mogą wkraść się do różnych etapy cyklu życia oprogramowania:

  • CI/CD skrypty które wdrażają lub budują artefakty
  • Wewnętrzne narzędzia programistyczne kontrolowanie środowisk
  • Integracje z innymi firmami zakładające, że dane wejściowe są bezpieczne.

Jeśli zależność przetwarza dane wejściowe użytkownika w Pythonie bez walidacji, dziedziczysz to ryzyko, nawet jeśli Twój kod jest bezpieczny. Dlatego walidacja musi być egzekwowana spójnie w całym kodzie. pipeline.

Przykład pipeline ryzyko:

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


				
			

Zapobiegawczy CI/CD egzekwowanie:

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


				
			

Zabrany klucz: Wiedza o tym, jak bezpiecznie uzyskać dane wejściowe od użytkownika w Pythonie, to tylko połowa zadania; automatyczne egzekwowanie zapewnia niebezpieczny kod nigdy nie trafi do produkcji.

Typowe wektory ataków

Niezabezpieczone dane wprowadzane przez użytkownika w Pythonie mogą skutkować czymś więcej niż tylko „złymi danymi”. Do typowych zagrożeń należą:

Obejście logiczne, pomijając uwierzytelnianie lub zmieniając przepływ przez spreparowane dane wejściowe.

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

				
			

Jeśli opierasz się na surowych danych wprowadzanych przez użytkownika w Pythonie, oddajesz kontrolę użytkownikowi lub atakującemu.

Bezpieczna alternatywa: weryfikacja i dezynfekcja danych wejściowych

Celem nie jest usunięcie wejście() w przypadku całego kodu chodzi o to, aby zapewnić, że dane wprowadzane przez użytkownika w Pythonie są sprawdzane przed wykonaniem krytycznych operacji.

Najbezpieczniejszym podejściem do pozyskiwania danych od użytkownika w Pythonie jest:

  • Wymuś sprawdzanie typów
  • Zastosuj białe listy dla dozwolonych wartości
  • Użyj bezpiecznych bibliotek parsujących, takich jak argparse oraz pidantycy.

Szybkie porównanie

ScenariuszNiepewny przykładBezpieczny przykład
Bezpośrednie użycie 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)
        
Walidacja strukturalna

# ⚠️ 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)
        

Najlepsze praktyki dotyczące wprowadzania danych przez użytkownika w Pythonie:

  • Konwertuj typy i obsługuj błędy (spróbuj/z wyjątkiem)
  • Zastosuj białe listy dla znanych wartości
  • Zastosowanie argparse dla CLI i pidantycy dla danych strukturalnych

Wykrywanie niebezpiecznych danych wejściowych i egzekwowanie ich przestrzegania CI/CD z Xygeni

Ręczne sprawdzanie nie wystarczy, aby wychwycić wszystkie niebezpieczne dane wprowadzane przez użytkowników Pythona; kluczem jest automatyzacja. Narzędzia takie jak Xygeni skanuj repozytoria w poszukiwaniu wzorców Pythona wprowadzanych przez użytkownika bez konieczności oczyszczania. Po zintegrowaniu z CI/CD, nie spełniają one zadania bezpieczeństwa, jeśli zostanie wykryta niebezpieczna obsługa danych wejściowych. Powoduje to zablokowanie scalania do chronionych gałęzi do czasu rozwiązania problemu.

ScenariuszNiepewny przykładBezpieczny przykład
Bezpośrednie użycie 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
        
Walidacja strukturalna

# ⚠️ 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 egzekwowanie

# 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
        

Jak to działa:

  1. Xygeni skanuje dane wprowadzane przez użytkownika Pythona w poszukiwaniu niebezpiecznych treści.
  2. Jeżeli zostanie znaleziony, zwraca kod wyjścia różny od zera.
  3. CI/CD oznacza zadanie jako nieudane.
  4. Ochrona gałęzi blokuje scalanie do momentu rozwiązania problemu.

Wymusza to bezpieczne i automatyczne pozyskiwanie danych od użytkownika w Pythonie.

Ostateczne dania na wynos

Nigdy nie ufaj danym wprowadzanym przez użytkownika w Pythonie bez weryfikacji. Pojedynczy, niezabezpieczony… wejście() może prowadzić do naruszeń, niepowodzeń wdrożeń lub całkowitego naruszenia bezpieczeństwa.

Plan działania:

  • Sprawdź od początku:  zastosuj konwersję typu, białe listy i biblioteki takie jak argparse or pidantycy przed przetworzeniem danych wejściowych użytkownika Python.
  • Automatyzacja wykrywania:  skonfigurować pipelines, aby zablokować scalanie w przypadku znalezienia niebezpiecznych wzorców.
  • Egzekwuj za pomocą bramek bezpieczeństwa:  zintegrować narzędzia takie jak Xygeni automatyczne blokowanie w chronionych gałęziach.
  • Edukuj swój zespół:  upewnij się, że wszyscy wiedzą, jak bezpiecznie pozyskiwać dane od użytkownika w Pythonie i rozumieją ryzyko związane z pomijaniem walidacji.

Bezpieczeństwo aplikacji nie zaczyna się w fazie produkcyjnej; zaczyna się w momencie napisania pierwszej linijki kodu. Ustaw bezpieczną obsługę wprowadzania danych jako domyślną.

sca-tools-oprogramowanie-narzędzia-analizy-kompozycji
Określ priorytety, rozwiąż problemy i zabezpiecz zagrożenia związane z oprogramowaniem
Załóż darmowe konto.
Nie wymagamy karty kredytowej.

Zabezpiecz rozwój i dostarczanie oprogramowania

z pakietem produktów Xygeni