Score:0

คำสั่ง `สถานที่' ไม่มีผลเมื่อมีตัวแปร

ธง no

สิ่งที่ฉันต้องการ

สำหรับฉัน /แอดมิน ตำแหน่ง ไวท์ลิสต์ที่อยู่ IP ที่เชื่อถือได้หลายรายการ และบล็อกทุกคน

สิ่งที่ฉันมี

http {
    แผนที่ $remote_addr $admin_block_path {
        เริ่มต้น "/admin";
        1.1.1.1 "/ไม่ใช่แอดมิน";
        8.8.8.8 "/ไม่ใช่ผู้ดูแลระบบ";
    }

    # â¦

    เซิร์ฟเวอร์ {
        add_header X-Test-Admin "$admin_block_path";
        ตำแหน่ง $admin_block_path {
            กลับ 403;
        }
    }

}

ความคิดคือการ ใช้ แผนที่ กำหนดเส้นทางที่จะปิดกั้นจากที่อยู่ IP ของผู้เข้าชมอย่างมีเงื่อนไข เก็บไว้ในตัวแปรและใช้ตัวแปรนั้นใน ที่ตั้ง. หากคำขอมาจาก IP ที่ไม่น่าเชื่อถือ ตัวแปรจะประกอบด้วย /แอดมินและตำแหน่งจะถูกบล็อก /แอดมิน.

อะไรคือปัญหา

เดอะ ที่ตั้ง ไม่ปิดกั้นการเข้าถึง /แอดมิน.

  • ฉันสามารถยืนยัน โดยใช้ add_header ว่าตัวแปรถูกตั้งค่าตามที่อยู่ IP อย่างถูกต้อง เมื่อเยี่ยมชมจาก IP ที่ไม่น่าเชื่อถือ ฉันจะได้รับ /แอดมินและตามลำดับ /ไม่ใช่แอดมิน เมื่อเยี่ยมชมจาก IP ที่เชื่อถือได้
  • ถ้าฉันเปลี่ยน ตำแหน่ง $admin_block_path ด้วยฮาร์ดโค้ด ตำแหน่ง/แอดมินคำขอจะถูกบล็อก
  • ลองเล่น double quotes ก็ไม่มีผล
  • พยายามใช้เครื่องหมายทับนอกตัวแปร ก็ไม่มีผล

บันทึก

ขออภัย ฉันไม่สามารถฮาร์ดโค้ดได้ อนุญาต/ปฏิเสธ ลงในบางส่วน /แอดมิน ที่ตั้งเพราะนั่นจะเขียนทับการกำหนดค่าผ่าน PHP ที่ฉันมีที่อื่นในการกำหนดค่า ด้วยเหตุนี้ฉันจึงต้องทุ่มเท /แอดมิน ตำแหน่งเฉพาะในกรณีที่ฉันรู้ว่าฉันจะปฏิเสธคำขอต่อไป และไม่จำเป็นต้องใช้ PHP

เวอร์ชั่น Nginx: 1.20.1

Score:3
ธง gr

ตำแหน่งทั้งหมดในการกำหนดค่า nginx ถูกรวบรวมเมื่อเริ่มต้น คุณไม่สามารถใช้ตัวแปรสำหรับ ที่ตั้ง พารามิเตอร์คำสั่ง (รวมถึงคุณไม่สามารถใช้ตัวแปรภายในรูปแบบ regex หรือกับคำสั่งอื่นๆ) นอกจากนี้ เมื่อเอกสารคำสั่ง nginx ไม่ได้ระบุไว้อย่างชัดเจนว่าคุณสามารถใช้ตัวแปรสำหรับพารามิเตอร์ของคำสั่งบางคำสั่งได้ โดยทั่วไปหมายความว่าคุณไม่สามารถทำได้ คุณควรใช้เทคนิคอื่นเพื่อให้บรรลุสิ่งที่คุณต้องการ หนึ่งในวิธีแก้ไขสามารถมีดังต่อไปนี้:

แผนที่ $remote_addr $admin_block_path {
    1.1.1.1 "";
    8.8.8.8 "";
    ค่าเริ่มต้น 1;
}

เซิร์ฟเวอร์ {
    ถ้า ($admin_block_path) {
        เขียนใหม่ ^/admin /blocked;
    }
    สถานที่ = / บล็อก {
        ภายใน;
        กลับ 403;
    }
    ...
}

ตำแหน่งที่ตรงทั้งหมดมีความสำคัญมากกว่า regex ดังนั้นจึงไม่ควรทำลายการกำหนดค่าตัวจัดการ PHP ของคุณ การทำให้ตำแหน่งนั้นอยู่ภายใน คุณสามารถมั่นใจได้ว่าจะไม่สามารถเข้าถึงได้โดยตรง (ผ่านกฎการเขียนใหม่เท่านั้น)

mehov avatar
no flag
ขอบคุณสำหรับความช่วยเหลือ วิธีนี้ได้ผล

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา