ภายในภาษาการเขียนโปรแกรมฉันรันคำสั่งเชลล์แบบง่าย ๆ
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