ภายในภาษาการเขียนโปรแกรมฉันรันคำสั่งเชลล์แบบง่าย ๆ
cd var; echo > create_a_file_here
ด้วยvarเป็นตัวแปรที่มีสตริง (หวังว่า) ไดเร็กทอรีไปยังตำแหน่งที่ฉันต้องการสร้างไฟล์ "create_a_file_here" ตอนนี้ถ้ามีคนเห็นบรรทัดของรหัสนี้มันเป็นไปได้ที่จะใช้ประโยชน์จากมันโดยการกำหนดเช่น:
var = "; rm -rf /"
สิ่งต่าง ๆ อาจดูน่าเกลียด วิธีหนึ่งในการหลีกเลี่ยงกรณีข้างต้นอาจเป็นการค้นหาสตริงในvarสำหรับอักขระพิเศษบางตัวเช่น ';' ก่อนดำเนินการคำสั่งเชลล์ แต่ฉันสงสัยว่าสิ่งนี้ครอบคลุมการหาประโยชน์ที่อาจเกิดขึ้นทั้งหมด
ไม่มีใครรู้วิธีที่ดีในการตรวจสอบว่า "cd var" เปลี่ยนเฉพาะไดเรกทอรีและไม่มีอะไรอีกหรือไม่
shหรือสร้างภาษาการเขียนโปรแกรมของคุณเองด้วยไวยากรณ์ที่คล้ายกัน แต่ขยายออกvarแทนที่จะให้คุณเขียนcd "$var"หรือไม่ หรือนี่คือbashด้วยshopt -s cdable_vars? โอ้ฉันคิดว่าคุณหมายถึงว่าโปรแกรมอื่นบางโปรแกรมบังคับให้เชลล์รันคำสั่งเหล่านี้ ดังนั้นเพียงแค่พูดvarแต่ให้แน่ใจว่าจะไม่รวมถึงตัวละครที่อ้างตัวเอง ...
s='"'; echo "$s" "
var=untrusted stringในโปรแกรมแม่จึงเป็นตัวแปรสภาพแวดล้อมที่กำหนดไว้แล้วเมื่อกล่าวอ้างvar shจากนั้นคุณต้องอ้างมันทุกครั้งที่คุณขยายมันซึ่งเป็นไปได้ที่จะทำอย่างน่าเชื่อถือ อาฉันเห็นว่าความคิดนี้เป็นส่วนหนึ่งของคำตอบของStéphaneแล้ว> <
varเป็นอาร์กิวเมนต์ได้ เช่นเรียกร้องshกับการขัดแย้ง-c,'cd "$1"; echo > create_a_file_here','sh', ผลงานและไม่จำเป็นต้องเปลี่ยนแปลงใดvarๆ อาร์กิวเมนต์จะถูกส่งเป็นvar'sh'$0