ในบริบทใดที่ปลั๊กอินรับผิดชอบการตรวจสอบข้อมูล / การฆ่าเชื้อ?


17

ฉันต้องการตรวจสอบให้แน่ใจว่าข้อมูลทั้งหมดในปลั๊กอิน / ชุดรูปแบบของฉันได้รับการจัดการอย่างปลอดภัยก่อนที่จะเข้าสู่ฐานข้อมูลและก่อนที่จะส่งออกไปยังเบราว์เซอร์ ปัญหาของฉันคือมีสถานการณ์ที่ API จัดการการฆ่าเชื้อสำหรับคุณ - เช่นเมื่อบันทึกเขตข้อมูลการโพสต์ - และอื่น ๆ ที่ผู้เขียนปลั๊กอิน / ชุดรูปแบบมีความรับผิดชอบทั้งหมดในการทำเช่น - เมื่อบันทึกการตั้งค่าที่กำหนดเอง

สำหรับขอบเขตของคำถามนี้ฉันไม่กังวลเกี่ยวกับการตรวจสอบข้อมูลในระดับโดเมน - เช่นการตรวจสอบว่าฟิลด์ Age บนฟอร์มอยู่ระหว่าง 0 ถึง 120 หรือที่อยู่อีเมลนั้นถูกต้อง ฉันกังวลเกี่ยวกับความปลอดภัยเท่านั้น - เช่นการหลีกเลี่ยงการสืบค้น SQL เพื่อหลีกเลี่ยงการฉีด SQL เมื่อบันทึกลงในฐานข้อมูลหรือฆ่าข้อมูลที่ส่งออกไปยังเทมเพลต HTML เพื่อหลีกเลี่ยง XSS

สำหรับการฆ่าเชื้อด้วยเอาท์พุตฉันรู้ว่าคุณจำเป็นต้องใช้ฟังก์ชั่นเช่นesc_html()และesc_attr()เมื่อสะท้อนตัวแปรในเทมเพลต HTML แต่แล้วเมื่อใช้แท็กเทมเพลตล่ะ พวกเขาทั้งหมดสะอาดผลลัพธ์แล้วหรือไม่ ถ้าเป็นเช่นนั้นสำหรับบริบทใด (HTML ทั่วไปแอตทริบิวต์ของแท็ก ฯลฯ ) บางฟังก์ชั่นมีตัวแปรสำหรับบริบทที่แตกต่างกัน (เช่นthe_title_attribute()แต่ส่วนใหญ่ไม่มี

สำหรับการฆ่าเชื้ออินพุตฉันรู้ว่าฉันต้องใช้$wpdb->prepare()เมื่อสร้างเคียวรีแบบแมนนวล แต่ถ้าใช้ API การตั้งค่าเพื่อสร้างหน้าการตั้งค่าปลั๊กอินหรือบันทึกเขตข้อมูลเมตาโพสต์สำหรับประเภทโพสต์ที่กำหนดเอง

ตอนนี้ฉันเพิ่งขุดผ่าน Core และการอ่านบทช่วยสอนทุกครั้งที่ฉันใช้ฟังก์ชั่นเพื่อตรวจสอบว่ามันฆ่าเชื้อหรือไม่ ฉันหวังว่าจะได้พบกับรายการที่ครอบคลุมบางส่วนเกี่ยวกับสถานการณ์ที่เป็นไปได้ทั้งหมดและไม่ว่า API จะจัดการกับมันหรือไม่ก็ตาม เช่น,

API ตรวจสอบ / ฆ่าเชื้อ

  • กำลังบันทึกเมตาโพสต์ด้วย update_postmeta()
  • กำลังบันทึกเมตาผู้ใช้ด้วย update_user_meta()
  • เอาท์พุทชื่อโพสต์ - ใช้ตัวแปรที่เหมาะสมตามบริบทของ the_title()
  • ฯลฯ

คุณต้องตรวจสอบ / ฆ่าเชื้อด้วยตนเอง

  • การบันทึกตัวเลือกปลั๊กอินด้วย API การตั้งค่า register_setting()ผ่านการโทรกลับเป็นพารามิเตอร์ที่ 3
  • การสืบค้นฐานข้อมูลตรง: Wrap $wpdb->prepare()แบบสอบถามใน
  • การแสดงผลตัวแปรใน HTML การใช้งานesc_attr(), esc_html()ฯลฯ
  • ฯลฯ

ฉันสนใจที่จะเข้าใจว่าทำไม API จึงให้มาในบางสถานการณ์ แต่ไม่ใช่ที่อื่น ๆ ฉันสมมติว่ามันมีบางอย่างเกี่ยวกับธรรมชาติของข้อมูลที่ไม่รู้จัก แต่อยากจะฟังคำอธิบายอย่างละเอียด


ฉันชอบคำถามนี้ ฉันมีความคิดเช่นเดียวกับคุณ ฉันคิดว่าถ้ามีรายการดังกล่าวเมื่อเราต้องตรวจสอบ / ฆ่าเชื้อด้วยตนเองมันจะดี +1
Anh Tran

1
@ ริลวิสโปรดดูคำตอบของฉัน คุณจะต้องตรวจสอบเสมอ การฆ่าเชื้อนั้นค่อนข้างซับซ้อนเนื่องจาก 'ปลอดภัย' ขึ้นอยู่กับบริบท โดยทั่วไปหากใช้ WordPress API กับข้อมูลที่รู้จักกันใน WordPress ( the_title()และthe_permalink()อื่น ๆ ) คุณก็ใช้ได้ แต่ด้วยข้อมูลที่กำหนดเองคุณจะไม่ได้ (เช่นget_post_meta()) หากสงสัยให้ฆ่าตัวตาย - ไม่สามารถทำให้เสียหายได้
Stephen Harris

@StephenHarris: ฉันอ่านความคิดเห็นของคุณ ฉันก็รู้เช่นกัน แต่ฉันมีความคิดเห็นแบบเดียวกันกับเอียนดันน์ ฉันคิดว่าเหตุผลหลักที่เขาถามคือ "ทำพอไม่มากไม่น้อย"
Anh Tran

1
จริง ๆ แล้วฉันไม่รังเกียจที่จะทำผิดในด้านของความระมัดระวังและทำการตรวจสอบ / สุขาภิบาลมากเกินไป แต่ฉันคิดว่ามีหลายกรณีที่การหลบหนีสิ่งต่าง ๆ สองครั้งอาจเป็นปัญหาได้
Ian Dunn

คำตอบ:


15

มีสองแนวคิดที่นี่:

  • การตรวจสอบ - ทำให้แน่ใจว่าข้อมูลถูกต้องเช่นจำนวนเต็มเป็นจำนวนเต็มวันที่เป็นวันที่ (ในรูปแบบที่ถูกต้อง ฯลฯ ) ควรทำก่อนบันทึกข้อมูล
  • sanitisation - ทำให้วันที่ปลอดภัยสำหรับการใช้งานในบริบทปัจจุบัน (เช่นการออกแบบสอบถาม SQL หรือหนี HTML ออก)

การตรวจสอบความถูกต้องเป็นไปตามที่คุณต้องการเท่านั้น คุณรู้ว่าข้อมูลใดที่คุณขอจากผู้ใช้และคุณรู้ว่าข้อมูลใดที่คุณคาดหวัง - WordPress ไม่ จะทำการตรวจสอบความถูกต้องเช่นบนsave_postตะขอก่อนบันทึกลงในฐานข้อมูลด้วยupdate_post_metaหรืออาจทำได้ผ่านการระบุฟังก์ชั่นการโทรกลับในการตั้งค่า API เรียกว่าก่อนที่ WordPress จะบันทึกข้อมูล

การฆ่าเชื้อนั้นค่อนข้างผสมกันมากกว่า เมื่อจัดการกับข้อมูลที่ WordPress รู้เกี่ยวกับ (เช่นไทล์ของโพสต์) คุณสามารถมั่นใจได้ว่า WordPress ทำให้ข้อมูลปลอดภัยแล้ว อย่างไรก็ตาม 'ปลอดภัย' ขึ้นอยู่กับบริบท สิ่งที่ปลอดภัยสำหรับการใช้งานบนหน้าเว็บไม่จำเป็นต้องปลอดภัยในฐานะองค์ประกอบของแอตทริบิวต์ ดังนั้น WordPress จะมีฟังก์ชั่นที่แตกต่างกันสำหรับบริบทที่แตกต่างกัน (เช่นthe_title(), the_title_rss(), the_title_attribute()) - ดังนั้นคุณจำเป็นต้องใช้หนึ่งที่เหมาะสม

ส่วนใหญ่ปลั๊กอินของคุณอาจจัดการกับโพสต์เมตา - หรืออาจเป็นข้อมูลกิจกรรมจากตารางที่กำหนดเอง WordPress ไม่รู้ว่าข้อมูลนี้คืออะไรหรือมีไว้เพื่ออะไรดังนั้นจึงไม่ทราบว่าจะปลอดภัยอย่างไร นี้ขึ้นอยู่กับคุณ นี้เป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งในการใช้esc_url(), esc_attr(), esc_textarea()ฯลฯ เพื่อป้องกันการป้อนข้อมูลที่เป็นอันตรายจากความสามารถในการโค้ดฝัง ตั้งแต่ WordPress รู้next_posts()คือคิดว่าจะพิมพ์ URL ไปยังหน้ามันใช้esc_url()- แต่มีการโพสต์เมตาพูดก็ไม่ได้รู้ว่ามันเก็บ URL ที่ - หรือสิ่งที่คุณต้องการที่จะทำอะไรกับมัน (ถ้าพิมพ์ถ้าเปลี่ยนเส้นทางesc_url() หากอยู่ใน dobut - ทำผิดด้านข้างของความระมัดระวังและหลบหนีด้วยตัวคุณเอง - และทำสิ่งนี้ให้ช้าที่สุดesc_url_raw()

ในที่สุด - สิ่งที่เกี่ยวกับการบันทึกข้อมูล? คุณต้องทำให้ปลอดภัยหรือไม่? เป็นที่กล่าวถึงคุณทำจำเป็นที่จะต้องให้แน่ใจว่าข้อมูลที่ถูกต้อง แต่ถ้าใช้ WordPress API ( wp_insert_post()และupdate_post_meta()อื่น ๆ ) คุณไม่จำเป็นต้องฆ่าเชื้อข้อมูล - เพราะเมื่อบันทึกข้อมูลการฆ่าเชื้อเพียงอย่างเดียวที่คุณต้องทำคือหนีงบ SQL - และ WordPress ทำสิ่งนี้ หากคุณใช้คำสั่ง SQL โดยตรง (พูดเพื่ออ่าน / เขียนข้อมูลจากตารางที่กำหนดเอง) จากนั้นคุณควรใช้$wpdbคลาสนี้เพื่อช่วยคุณในการทำความสะอาดแบบสอบถามของคุณ

ฉันเขียนโพสต์บล็อกนี้เกี่ยวกับการล้างข้อมูลและการตรวจสอบความถูกต้องซึ่งคุณอาจพบว่ามีประโยชน์ - ฉันพูดถึงสิ่งที่คุณคาดหวังในแง่นี้


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

ฉันเพิ่งปรับปรุงคำถามเพื่อชี้แจงบางสิ่ง
Ian Dunn

0

ไม่แน่ใจว่าเป็นอย่างละเอียด แต่ด้วยปลั๊กอินหรือธีมใด ๆ อินพุตของผู้ใช้ควรถูกทำให้สะอาด การดำเนินการฐานข้อมูลควรทำโดยใช้วิธี $ wpdb-> ข้อมูล $ _GET และ $ _POST ทั้งหมดควรได้รับการฆ่าเชื้อ

นี่เป็นแนวปฏิบัติที่ดีที่สุดสำหรับการเขียนโปรแกรม PHP มากกว่า WordPress

ดังนั้นโดยสรุปหากมีฟังก์ชั่น WordPress ให้ใช้ถ้าไม่ทำความสะอาดตัวแปรของคุณและป้อนข้อมูลด้วยตัวคุณเอง

ถ้าฉันคลุมเครือเกินไปโปรดถามคำถามที่เจาะจงกว่านี้


3
ฉันเข้าใจว่าจำเป็นต้องได้รับการทำให้สะอาดอยู่เสมอ แต่คำถามก็คือว่าใครจะมีการฆ่าเชื้อในแต่ละสถานการณ์ บางครั้ง WordPress ทำโดยอัตโนมัติและบางครั้งคุณต้องทำด้วยตนเอง ฉันได้อัปเดตคำถามเพื่อพยายามให้ชัดเจนยิ่งขึ้น
Ian Dunn

แม้เมื่อใช้ update_user_meta () คุณยังคงต้องตรวจสอบความถูกต้องเนื่องจากค่าที่อัปเดตอาจมาจากรูปแบบที่เปิดเผยหรือจากอินพุตของผู้ใช้ หากเป็นค่าที่มาจากสคริปต์เช่นการตัดสินใจภายในจาก if / else วนซ้ำคุณไม่ควรฆ่ามัน
Ciprian

1
ค่าที่คุณส่งผ่านไปยังupdate_user_meta()ได้รับการส่งผ่านstripslashes_deep()และsanitize_meta()ในupdate_metadata()และจากนั้นใน$wpdb->prepare() $wpdb->update()ดังนั้นฉันไม่คิดว่าคุณจะต้องทำให้สะอาด ฉันพลาดอะไรไปรึเปล่า?
Ian Dunn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.