การใช้สวิตช์เพื่อกำหนดวิธี HTTP ปลอดภัยหรือไม่

ฉันเพิ่งอ่านบทช่วยสอน (http://code.tutsplus.com/tutorials/a-beginners-guide-to-http-and-rest--net-16340) ในการกำหนดส่วนหัว HTTP เพื่อเปลี่ยนการทำงานของสคริปต์ บทช่วยสอนนี้ให้ตัวอย่างสคริปต์ PHP เพื่อทำสิ่งนี้ให้สำเร็จ

$method = $_SERVER['REQUEST_METHOD'];

switch($method) {
  case 'PUT':
    $this->create_contact($name);
  break;

  case 'DELETE':
    $this->delete_contact($name);
  break;

  case 'GET':
    $this->display_contact($name);
  break;

  default:
    header('HTTP/1.1 405 Method Not Allowed');
    header('Allow: GET, PUT, DELETE');
   break;
}

...และการกล่าวถึง

เราใช้คำสั่ง switch ซึ่งควรหลีกเลี่ยงในการใช้งานจริง:

คำถามหลายข้อ:

  1. เหตุใดคุณจึงหลีกเลี่ยงการใช้ฟังก์ชันนี้
  2. มีช่องโหว่ในการใช้คำสั่ง switch หรือไม่หรือเป็นตัวแปร $_SERVER ที่ทำให้เกิดช่องโหว่
  3. คำตอบในโพสต์นี้ ($_SERVER['QUERY_STRING'] ปลอดภัยจาก XSS หรือไม่) แนะนำให้ใช้ htmlentities เพื่อปกป้องค่า $_SERVER เพียงพอหรือไม่?

ขอบคุณมาก ๆ!


person Community    schedule 29.09.2014    source แหล่งที่มา


คำตอบ (2)


เหตุใดคุณจึงหลีกเลี่ยงการใช้ฟังก์ชันนี้

โปรแกรมเมอร์จำนวนมากจะเลือกเหตุผลเพื่อหลีกเลี่ยงการใช้คำสั่ง "switch" ขึ้นอยู่กับบริบท

ตัวอย่างเช่น โครงการอาจมี "switch" คำสั่งที่มีโค้ดซ้ำ จำนวนมากเพื่อทำสิ่งที่จะ ได้รับการแก้ไขด้วยความหลากหลาย

ในกรณีนี้ "สวิตช์" กำลังถูกใช้เพื่อแมปวิธี HTTP ด้วย callables (ยกเว้น "ค่าเริ่มต้น"): คุณสามารถแมปวิธี http กับ callables ที่สามารถแทนที่ได้ในรันไทม์ โปรแกรมเมอร์ Python ที่ปฏิบัติตาม "ปรัชญา pythonic" ใช้พจนานุกรมเพื่อทำสิ่งเดียวกันกับคำสั่ง "switch" แต่มีความสามารถในการเปลี่ยนแผนที่ในรันไทม์

มีช่องโหว่ในการใช้คำสั่ง switch หรือไม่ หรือเป็นตัวแปร $_SERVER ที่ทำให้เกิดช่องโหว่

ไม่ ไม่มีช่องโหว่ในการใช้ "สวิตช์" เพียงอย่างเดียว

คุณไม่ควรส่งต่อค่าจาก $_SERVER เพราะ เป็นข้อมูลจากเว็บไคลเอ็นต์ (โดยปกติคือเบราว์เซอร์) สคริปต์ "curl" ธรรมดาสามารถส่งข้อมูลที่ไม่ถูกต้องหรือไม่ถูกต้อง เช่น ที่อยู่ IP, User-agent, ผู้อ้างอิง ฯลฯ สิ่งนี้มีประโยชน์สำหรับการขูดเว็บ (บางเว็บไซต์ถูกนำมาใช้เพื่อป้องกันการขูดแบบไร้เดียงสา)

ตรวจสอบฟังก์ชัน "filter_input" เพื่อกรองค่าจากตัวแปรร่วมด้วยอินพุต ค่า ($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV)

คำตอบในโพสต์นี้ ( $_SERVER['QUERY_STRING'] ปลอดภัยจาก XSS หรือไม่) แนะนำให้ใช้ htmlentities เพื่อปกป้องค่า $_SERVER เพียงพอหรือไม่?

ขึ้นอยู่กับบริบท

ตัวอย่างเช่น หากคุณต้องการใช้สำหรับโค้ด JavaScript การป้องกันจาก XSS นั้นไม่เพียงพอ ในกรณีนี้ คุณจะต้องใช้ฟังก์ชันเพื่อหลีกสตริงสำหรับ javascript ("json_encode" อาจมีประโยชน์ในกรณีนี้)

person Pedro Amaral Couto    schedule 30.09.2014
comment
ขอบคุณมากสำหรับคำตอบโดยละเอียด โดยเฉพาะลิงก์ไปยัง PHP-ing ที่ปลอดภัยยิ่งขึ้น - person ; 01.10.2014

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

โปรแกรมเมอร์บางคนคิดว่าโครงสร้าง switch อ่านได้น้อยกว่า if/else ทั้งนี้ขึ้นอยู่กับรสนิยมส่วนบุคคล ไม่มีอะไรที่ "ไม่ปลอดภัย" โดยเนื้อแท้เกี่ยวกับการใช้ switch

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

person i alarmed alien    schedule 29.09.2014
comment
ขอบคุณ. คำถามส่วนใหญ่ที่ฉันพบเกี่ยวกับการฆ่าเชื้ออินพุตใน PHP อ้างถึงข้อความที่เตรียมไว้ ดูเหมือนว่าจะไม่มีคำตอบที่ตรงไปตรงมาสำหรับสถานการณ์ด้านสุขอนามัย (owasp.org/index.php/ XSS_Filter_Evasion_Cheat_Sheet) - person ; 29.09.2014