การรับข้อมูลจากผู้ใช้ใน Python - วิธีรับข้อมูลจากผู้ใช้ใน Python

วิธีที่ไม่ถูกต้องในการรับข้อมูลจากผู้ใช้ใน Python (และทางเลือกที่ปลอดภัยกว่า)

เมื่อ อินพุต () ผิดพลาดไป

สคริปต์การปรับใช้ Python เคยขอคำสั่งคอนโซล แต่การพิมพ์ผิดเพียงครั้งเดียวทำให้เกิดการทำงานผิดพลาดและส่งผลให้การสร้างเวอร์ชันใช้งานจริงล้มเหลว นั่นคืออันตรายของการรับข้อมูลจากผู้ใช้ใน Python: สตริงที่ไม่ได้ตรวจสอบเพียงสตริงเดียวอาจทำให้เกิดการโจมตีแบบ Injection, การสูญเสียข้อมูล หรือการข้ามขั้นตอนการทำงานของระบบได้ เราจะมาวิเคราะห์กันว่าทำไมจึงเกิดเหตุการณ์เช่นนี้ และวิธีการจัดการกับการรับข้อมูลจากผู้ใช้ใน Python อย่างปลอดภัย ทั้งในโครงการโอเพนซอร์สและโครงการภายในองค์กร

ปัญหาเกี่ยวกับ อินพุตของผู้ใช้() หลาม

การขอ อินพุต () ฟังก์ชันใน Python นั้นง่ายมาก คือมันอ่านข้อความจากคอนโซลและส่งคืนค่าเป็นสตริง ไม่มีการตรวจสอบความถูกต้อง ไม่มีการตรวจสอบใดๆ ทั้งสิ้น ถ้าพิจารณาแยกกัน ดูเหมือนจะไม่เป็นอันตรายอะไร แต่ในบทภาพยนตร์ล่ะ... CI/CD ในการทำงานและเครื่องมืออัตโนมัติ การส่งข้อมูลอินพุตจากผู้ใช้ Python โดยตรงไปยังคำสั่งหรือฟังก์ชันนั้นเปิดช่องทางให้เกิดช่องโหว่ได้

⚠️ ตัวอย่างเพื่อการศึกษาเท่านั้น ไม่สามารถใช้งานได้จริงหรือนำไปดัดแปลงแก้ไขได้

หากคุณสงสัยว่าจะรับข้อมูลจากผู้ใช้ใน Python อย่างปลอดภัยได้อย่างไร คำตอบนั้นง่ายมาก: อย่าเชื่อถือข้อมูลนั้นโดยไม่ตรวจสอบให้ดีก่อน

ความเสี่ยงและการจัดการอย่างปลอดภัยใน DevSecOps Pipelines

การป้อนข้อมูลที่ไม่ปลอดภัยของผู้ใช้ Python อาจแฝงตัวเข้ามาในรูปแบบต่างๆ ได้ ขั้นตอนต่างๆ ของวงจรชีวิตซอฟต์แวร์:

  • CI/CD สคริปต์ ที่ปรับใช้หรือสร้างสิ่งประดิษฐ์
  • เครื่องมือสำหรับนักพัฒนาภายใน การควบคุมสภาพแวดล้อม
  • การบูรณาการกับบุคคลที่สาม ซึ่งถือว่าข้อมูลที่ป้อนเข้ามานั้นปลอดภัย

หากไลบรารีใดๆ ประมวลผลข้อมูลที่ผู้ใช้ป้อนเข้ามาด้วย Python โดยไม่มีการตรวจสอบความถูกต้อง คุณก็จะได้รับความเสี่ยงนั้นไปด้วย แม้ว่าโค้ดของคุณจะปลอดภัยก็ตาม นั่นเป็นเหตุผลว่าทำไมการตรวจสอบความถูกต้องจึงต้องถูกบังคับใช้สม่ำเสมอทั่วทั้งไลบรารี pipeline.

ตัวอย่าง pipeline ความเสี่ยง:

ป้องกัน CI/CD การบังคับใช้:

Takeaway ที่สำคัญ: การรู้วิธีรับข้อมูลจากผู้ใช้ใน Python อย่างปลอดภัยนั้นเป็นเพียงครึ่งหนึ่งของงานเท่านั้น การบังคับใช้โดยอัตโนมัติจะช่วยให้มั่นใจได้ว่า... โค้ดที่ไม่ปลอดภัยจะไม่ถูกนำไปใช้งานจริง

เวกเตอร์การโจมตีทั่วไป

การป้อนข้อมูลที่ไม่ปลอดภัยใน Python อาจก่อให้เกิดปัญหามากกว่าแค่ “ข้อมูลผิดพลาด” ความเสี่ยงทั่วไป ได้แก่:

  • คำสั่งฉีดส่งข้อมูลที่ผู้ใช้ควบคุมไปยังคำสั่งระบบ
  • การฉีดรหัส: ดำเนินการโค้ดที่สร้างขึ้นแบบไดนามิกจากข้อมูลที่ป้อนเข้ามา

การบายพาสเชิงตรรกะโดยการข้ามขั้นตอนการตรวจสอบสิทธิ์หรือเปลี่ยนแปลงขั้นตอนการทำงานผ่านการป้อนข้อมูลที่ออกแบบมาเป็นพิเศษ

หากคุณใช้ Python โดยอาศัยข้อมูลที่ผู้ใช้ป้อนเข้ามาโดยตรง คุณกำลังมอบการควบคุมให้กับผู้ใช้หรือผู้โจมตี

ทางเลือกที่ปลอดภัยกว่า: การตรวจสอบและกรองข้อมูลที่ป้อนเข้ามา

เป้าหมายไม่ใช่การกำจัด อินพุต () จากโค้ดทั้งหมด จุดประสงค์คือเพื่อให้แน่ใจว่าข้อมูลที่ผู้ใช้ป้อนเข้ามาใน Python ได้รับการตรวจสอบความถูกต้องก่อนที่จะนำไปใช้กับขั้นตอนการทำงานที่สำคัญ

วิธีการที่ปลอดภัยที่สุดในการรับข้อมูลจากผู้ใช้ใน Python คือ:

  • บังคับใช้การตรวจสอบประเภท
  • ใช้รายการค่าที่อนุญาต (whitelist)
  • ใช้ไลบรารีการแยกวิเคราะห์ที่ปลอดภัย เช่น หาเรื่อง และ ปิคนิค.

เปรียบเทียบอย่างรวดเร็ว

สถานการณ์ ตัวอย่างที่ไม่ปลอดภัย ตัวอย่างที่ปลอดภัย
การใช้งานโดยตรงของ 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:

  • แปลงประเภทและจัดการข้อผิดพลาด (ลอง/ยกเว้น)
  • ใช้รายการที่อนุญาตสำหรับค่าที่ทราบแล้ว
  • ใช้ หาเรื่อง สำหรับ 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 โดยไม่มีการตรวจสอบความถูกต้อง ช่องโหว่ความปลอดภัยเพียงจุดเดียวก็เพียงพอแล้ว อินพุต () อาจนำไปสู่การละเมิด การใช้งานล้มเหลว หรือการถูกโจมตีอย่างสมบูรณ์

แผนปฏิบัติการ:

  • ตรวจสอบความถูกต้องตั้งแต่เริ่มต้น:  ใช้การแปลงประเภท รายการที่อนุญาต และไลบรารีต่างๆ เช่น หาเรื่อง or ปิคนิค ก่อนประมวลผลข้อมูลที่ผู้ใช้ป้อนเข้ามา Python
  • ระบบตรวจจับอัตโนมัติ:  กำหนดค่า pipelineเพื่อบล็อกการผสานเมื่อพบรูปแบบที่ไม่ปลอดภัย
  • ติดตั้งประตูรักษาความปลอดภัยเพื่อบังคับใช้มาตรการ:  ผสานรวมเครื่องมือต่างๆ เช่น Xygeni สำหรับ การบล็อคอัตโนมัติ ในกิ่งไม้ที่ได้รับการปกป้อง
  • ให้ความรู้แก่ทีมงานของคุณ:  ตรวจสอบให้แน่ใจว่าทุกคนรู้วิธีรับข้อมูลจากผู้ใช้ใน Python อย่างปลอดภัย และเข้าใจถึงความเสี่ยงของการข้ามขั้นตอนการตรวจสอบความถูกต้อง

การรักษาความปลอดภัยของแอปพลิเคชันไม่ได้เริ่มต้นในขั้นตอนการใช้งานจริงมันเริ่มต้นตั้งแต่วินาทีที่คุณเขียนโค้ดบรรทัดแรก ตั้งค่าการจัดการข้อมูลเข้าอย่างปลอดภัยเป็นค่าเริ่มต้น

sca-tools-software-composition-analysis-tools
จัดลำดับความสำคัญ แก้ไข และรักษาความปลอดภัยความเสี่ยงด้านซอฟต์แวร์ของคุณ
สมัครบัญชีฟรีได้เลย
ไม่ต้องใช้บัตรเครดิต

รักษาความปลอดภัยให้กับการพัฒนาและส่งมอบซอฟต์แวร์ของคุณ

ด้วยชุดผลิตภัณฑ์ Xygeni