ปลอดภัยหรือไม่ที่จะใช้$_SERVER['HTTP_HOST']
สำหรับลิงก์ทั้งหมดในเว็บไซต์โดยไม่ต้องกังวลเกี่ยวกับการโจมตี XSS แม้ว่าจะใช้ในรูปแบบหรือไม่
ใช่มันปลอดภัยที่จะใช้$_SERVER['HTTP_HOST']
(และแม้แต่$_GET
และ$_POST
) ตราบใดที่คุณตรวจสอบพวกเขาก่อนที่จะยอมรับพวกเขา นี่คือสิ่งที่ฉันทำกับเซิร์ฟเวอร์ที่ปลอดภัย:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
ประโยชน์ของการเป็นว่าพฤติกรรมของมันจะดีขึ้นกว่าที่กำหนดไว้$_SERVER['HTTP_HOST']
$_SERVER['SERVER_NAME']
ความคมชัด➫➫ :
เนื้อหาของโฮสต์: ส่วนหัวจากคำขอปัจจุบันหากมี
ด้วย:
ชื่อของโฮสต์เซิร์ฟเวอร์ที่สคริปต์ปัจจุบันทำงานอยู่
การใช้อินเทอร์เฟซที่กำหนดไว้ดีกว่า $_SERVER['HTTP_HOST']
หมายถึงว่า SAPIs จะใช้งานได้มากขึ้นโดยใช้พฤติกรรมที่กำหนดไว้อย่างน่าเชื่อถือ (ไม่เหมือนที่อื่น ) อย่างไรก็ตามมันยังคงพึ่งพา SAPI ทั้งหมดtotally :
ไม่รับประกันว่าทุกเว็บเซิร์ฟเวอร์จะให้ [ $_SERVER
รายการ] เหล่านี้ใด ๆ; เซิร์ฟเวอร์อาจละเว้นบางเซิร์ฟเวอร์หรือให้บริการอื่นที่ไม่อยู่ในรายการนี้
เพื่อให้เข้าใจถึงวิธีการเรียกชื่อโฮสต์ได้อย่างถูกต้องอันดับแรกและสำคัญที่สุดคุณต้องเข้าใจว่าเซิร์ฟเวอร์ที่มีรหัสเท่านั้นไม่มีวิธีที่จะทราบ (จำเป็นต้องมีการตรวจสอบล่วงหน้า) ชื่อของตัวเองบนเครือข่าย มันต้องการที่จะเชื่อมต่อกับองค์ประกอบที่เป็นชื่อของมันเอง สามารถทำได้ผ่าน:
โดยปกติจะทำผ่านไฟล์ปรับแต่ง local (SAPI) โปรดทราบว่าคุณได้กำหนดค่าไว้อย่างถูกต้องเช่นใน Apache ➫➫ :
สองสิ่งต่าง ๆ จะต้อง 'ปลอม' เพื่อทำให้โฮสต์เสมือนแบบไดนามิกดูเหมือนปกติ
ที่สำคัญที่สุดคือชื่อเซิร์ฟเวอร์ที่ Apache ใช้เพื่อสร้าง URL อ้างอิงตนเองเป็นต้นซึ่งได้รับการกำหนดค่าด้วยServerName
คำสั่งและสามารถใช้งานได้กับ CGIs ผ่านSERVER_NAME
ตัวแปรสภาพแวดล้อม
ค่าจริงที่ใช้ในขณะดำเนินการถูกควบคุมโดยการตั้งค่า UseCanonicalName
ด้วย UseCanonicalName Off
ชื่อเซิร์ฟเวอร์มาจากเนื้อหาของHost:
ส่วนหัวในคำขอ ด้วย UseCanonicalName DNS
มันมาจากการค้นหา DNS ย้อนกลับของที่อยู่ IP ของโฮสต์เสมือน การตั้งค่าแบบเดิมใช้สำหรับการโฮสต์เสมือนแบบไดนามิกที่ใช้ชื่อและการตั้งค่าแบบหลังใช้สำหรับการโฮสต์แบบ IP **
หาก Apache ไม่สามารถทำงานได้ออกชื่อเซิร์ฟเวอร์เพราะไม่มีHost:
หัวหรือ DNS การค้นหาล้มเหลวแล้วค่าการกำหนดค่าด้วยServerName
ใช้แทน