ไลบรารี VirtualPath
ปรับเส้นทางให้เป็นมาตรฐานและป้องกันการโจมตีการข้ามผ่านไดเรกทอรีโดยไม่ต้องสอบถามระบบไฟล์
ขอแนะนำให้ใช้ Composer ตัวจัดการการพึ่งพาเพื่อติดตั้ง rayne/virtual-path
composer require rayne/virtual-path
คลาส VirtualPath
ปรับอินพุตให้เป็น virtual path สัมบูรณ์โดยไม่ต้องสอบถามระบบไฟล์ใด ๆ นอกจากนี้ยังตรวจจับและตั้งค่าสถานะการโจมตีการข้ามผ่านไดเรกทอรี
คลาส JailedPath
ใช้ VirtualPath
เพื่อสร้างเส้นทางที่ปลอดภัยซึ่งสามารถใช้สำหรับทำงานกับไฟล์จริงได้ การทำให้เป็นมาตรฐานเสร็จสิ้นโดยสัมพันธ์กับ jail
ที่เรียกว่าเส้นทางซึ่งใช้เป็นรูทเสมือนสำหรับเส้นทางใด ๆ ที่ผู้ใช้ป้อน เนื่องจาก JailedPath
ไม่ได้สืบค้นระบบไฟล์ จึงเหมาะสำหรับการทำงานกับเส้นทางในเครื่อง ระยะไกล หรือในนิยาย
โปรดอ่านส่วนรายละเอียดการใช้งานเพื่อดูรายละเอียดเพิ่มเติม
TL; DR ใช้คลาส JailedPath
เมื่อมีข้อสงสัย
JailedPath
ในตัวอย่างนี้ ผู้เยี่ยมชมเว็บไซต์จะได้รับอนุญาตให้ดาวน์โหลดไฟล์ใดๆ จากไดเร็กทอรีในเครื่อง /test
โดยระบุพาธสัมพัทธ์เป็นพารามิเตอร์ GET
เพื่อป้องกันไม่ให้ผู้ใช้ออกจากไดเร็กทอรีด้วยการโจมตีผ่านไดเร็กทอรี JailedPath
จะใช้ร่วมกับ /test
เป็นไดเร็กทอรีรากเสมือน
<?php
use Rayne VirtualPath JailedPath ;
$ jailedPath = new JailedPath ( ' /test ' , $ _GET [ ' path ' ] ?? '' );
if ( $ jailedPath -> hasJailbreakAttempt ()) {
// Log jailbreak attempt, ban user, …
return ;
}
if ( is_file ( $ jailedPath -> getAbsolutePath ())) {
@ readfile ( $ jailedPath -> getAbsolutePath ());
}
ตารางต่อไปนี้แสดงวิธีการทำให้เส้นทางที่ผู้ใช้กำหนดเป็นมาตรฐาน และวิธีการตีความเส้นทางที่สัมพันธ์กับรูทเสมือน
ข้อมูลผู้ใช้ | hasJailbreakAttempt() | getAbsolutePath() | getRelativePath() |
---|---|---|---|
สตริงว่าง | false | /test | สตริงว่าง |
. | false | /test | สตริงว่าง |
a.png/../b.png | false | /test/b.png | b.png |
/a/./b | false | /test/a/b | a/b |
.. | true | /test | สตริงว่าง |
../example | true | /test/example | example |
../etc/passwd | true | /test/etc/passwd | etc/passwd |
อาร์เรย์ | true | /test | สตริงว่าง |
VirtualPath
หากไม่จำเป็นต้องใช้คำนำหน้าคงที่หรือการเคลือบน้ำตาลของ JailedPath
VirtualPath
ก็เพียงพอแล้วเนื่องจากเป็นคลาสที่ใช้สำหรับการปรับเส้นทางให้เป็นมาตรฐาน VirtualPath
ทำให้อินพุตเป็นมาตรฐานและจัดเตรียมเส้นทางที่เชื่อถือได้ (ทำให้เป็นมาตรฐาน โดยมีการนำหน้า /
) และเส้นทางที่ไม่น่าเชื่อถือ (แสดงสตริงของอินพุตผู้ใช้ที่อาจเป็นอันตราย)
ตัวอย่างก่อนหน้านี้สามารถสร้างขึ้นใหม่ได้อย่างง่ายดายด้วย VirtualPath
เมื่ออินสแตนซ์ของ VirtualPath
(ซึ่งก็คือ (string)
สามารถส่งได้) ถูกต่อท้ายไดเรกทอรีรากเสมือน
<?php
use Rayne VirtualPath VirtualPath ;
$ path = new VirtualPath ( $ _GET [ ' path ' ] ?? '' );
$ absolutePath = ' /test ' . $ path ;
ขึ้นอยู่กับสถานการณ์การใช้งาน บางครั้งการทำงานกับพาธที่เชื่อถือได้แบบมาตรฐาน แม้ว่าอินพุตดั้งเดิมจะไม่น่าเชื่อถือก็ตาม เช่น เมื่อสนับสนุนพาธแบบสัมพันธ์อย่างชัดเจน และให้ประโยชน์แก่ผู้ใช้โดยมีข้อสงสัยเมื่อพยายามเข้าถึงไฟล์ภายนอก virtual path โดยไม่ตั้งใจ
หมายเหตุ : VirtualPath
ส่งคืนพาธที่ทำให้เป็นมาตรฐานโดยมี /
. เมื่อทำงานกับไฟล์ ขอแนะนำให้เพิ่มพาธที่เชื่อถือได้เป็นคำนำหน้า (ดูตัวอย่างโค้ดในส่วนปัจจุบัน) ไม่เช่นนั้นไฟล์ที่เกี่ยวข้องกับรูทของระบบไฟล์จะถูกอ้างอิง อย่าลืมเพิ่มคำนำหน้าให้ใช้คลาส JailedPath
แทนเมื่อทำงานกับไฟล์จริง
ป้อนข้อมูล | isTrusted() | getTrustedPath() | getUntrustedPath() |
---|---|---|---|
อาร์เรย์ | false | / | สตริงว่าง |
สตริงว่าง | true | / | สตริงว่าง |
../articles | false | /articles | ../articles |
tags/../../articles | false | /articles | tags/../../articles |
tags/../articles | true | /articles | tags/../articles |
../etc/passwd | false | /etc/passwd | ../etc/passwd |
/etc/passwd | true | /etc/passwd | /etc/passwd |
etc/passwd | true | /etc/passwd | etc/passwd |
การใช้เส้นทางที่ทำให้เป็นมาตรฐานเสมือนล้วนมีข้อดีที่แตกต่างกัน:
การทำให้เส้นทางเป็นมาตรฐานเสร็จสิ้นโดยไม่ต้องสอบถามระบบไฟล์
เป็นไปไม่ได้ที่จะสร้างการโจมตีตามเวลาสำหรับไฟล์ที่อยู่นอกขอบเขตของ virtual path
ไม่จำเป็นต้องมีการเปรียบเทียบที่ซับซ้อนเพื่อจำกัดการข้ามผ่านไดเร็กทอรีไปยังไดเร็กทอรีเฉพาะและลูก ๆ ของไดเร็กทอรี
เท่านั้น .
, ..
, (ทำให้เป็นมาตรฐาน
/
) และ /
ถูกตีความเพื่อทำให้เส้นทางเป็นมาตรฐาน
ไม่มีสิ่งที่ไม่คาดคิดและข้อมูลรั่วไหล ~
การขยายตัวตามที่เห็นในห้องสมุดอื่น
การใช้งาน VirtualPath
ไม่ตีความ เปลี่ยนแปลง หรือลบอักขระควบคุมและ Unicode:
ไดเร็กทอรีและพาธไฟล์ได้รับอนุญาตให้มีอักขระควบคุมบนบางระบบ
การลบอักขระควบคุมอยู่นอกขอบเขตสำหรับไลบรารี
โคลนพื้นที่เก็บข้อมูล
git clone https://github.com/rayne/virtual-path.git
ติดตั้งการพึ่งพาการพัฒนา
composer install --dev
ดำเนินการทดสอบ
composer test