Data sanitization: แนวทางปฏิบัติที่ดีที่สุดพร้อมตัวอย่างโค้ด


15

ฉันกำลังพยายามทำความเข้าใจกับการล้างข้อมูล (ไม่ใช่การตรวจสอบข้อมูล) เพื่อช่วยฉันในการเขียนธีมที่ปลอดภัยสำหรับ WordPress ฉันค้นหาทางอินเทอร์เน็ตเพื่อค้นหาคำแนะนำที่เข้าใจง่ายสำหรับนักพัฒนาชุดรูปแบบที่มีรายละเอียดวิธีปฏิบัติที่ดีที่สุด มีทรัพยากรอยู่สองสามอย่างที่ฉันเจอรวมถึงเพจ codex ที่ชื่อว่า Data Validation แม้ว่าจะไม่มีประโยชน์อะไรสำหรับฉัน หน้า codex แสดงรายการฟังก์ชั่นการฆ่าเชื้อที่มีอยู่การใช้งานและสิ่งที่พวกเขาทำ แต่ล้มเหลวในการอธิบายว่าทำไมคุณจึงใช้ฟังก์ชันหนึ่งเหนือสิ่งอื่นหรือในสถานการณ์ที่คุณจะใช้ฟังก์ชั่นการฆ่าเชื้อ จุดประสงค์ของโพสต์นี้คือเพื่อขอให้ทุกคนมีส่วนร่วมในตัวอย่างของรหัสที่ไม่ดี / ไม่ถูกแก้ไขและวิธีการเขียนใหม่เพื่อการสุขาภิบาลที่ถูกต้อง นี่อาจเป็นรหัสทั่วไปในการทำให้สะอาดชื่อโพสต์หรือโพสต์ thumnails src หรือรหัสที่ซับซ้อนมากขึ้นที่จัดการการฆ่าเชื้อของ$_POST ข้อมูลสำหรับคำขอ Ajax

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

add_user_meta
update_user_meta
add_post_meta
update_post_meta
//just to name a few

นอกจากนี้การฆ่าเชื้อจะต้องทำแตกต่างกันเมื่อสะท้อน HTML ใน PHP เมื่อเทียบกับ PHP แบบอินไลน์ของ HTML หรือไม่? เพื่อให้ชัดเจนยิ่งขึ้นกับสิ่งที่ฉันถามนี่คือรหัส:

<?php echo '<div class="some-div ' . $another_class . '" data-id="' . $id . '" >' . $text . '</div>'; ?>

<div class="some-div <?php echo $another_class; ?>" data-id="<?php echo $id; ?>"><?php echo $text; ?></div>

ข้อความทั้งสองข้างต้นบรรลุในสิ่งเดียวกัน แต่พวกเขาต้องได้รับการ santized แตกต่างกันอย่างไร


1
มันอาจช่วยได้ถ้าเรารู้ว่าคุณพยายามฆ่าเชื้อ ชุดรูปแบบมีไว้สำหรับการนำเสนอข้อมูล ... คุณจะต้องฆ่าเชื้อข้อมูลที่ผู้ใช้ส่งให้คุณเท่านั้นและโดยทั่วไปแล้วปลั๊กอินจะจัดการโดยการส่ง
EAMann

@EAMann Escaping ฟังก์ชั่นเช่น esc_attr, esc_html ฯลฯ ถูกสร้างขึ้นเพื่อหนีเอาท์พุต ถูกต้องฉันถ้าฉันผิด การนำเสนอข้อมูลหมายความว่าคุณกำลังส่งออกข้อมูลดังนั้นการหลบหนีจำเป็นต้องมีในธีมด้วย มิฉะนั้นจะไม่จำเป็นต้องใช้ฟังก์ชั่น esc ฉันต้องการที่จะเข้าใจการฆ่าเชื้อในธีม WordPress โดยรวมและไม่ จำกัด เพียงการแยกส่วนของโค้ดหนึ่งหรือสอง
จอห์น

"การนำเสนอข้อมูลหมายความว่าคุณกำลังส่งออกข้อมูลดังนั้นการหลบหนีจำเป็นต้องใช้ในธีมเช่นกัน" - ไม่ อีกครั้งคุณจะต้องหลบหนีข้อมูลที่คุณไม่ไว้วางใจ
onetrickpony

@OneTrickPony มันชัดเจนขึ้นสำหรับฉัน เพื่อให้แน่ใจว่าฉันเข้าใจอย่างถ่องแท้ - ฉันจะหลีกเลี่ยงเนื้อหาความคิดเห็น แต่จะไม่หลบหนี ID ความคิดเห็นหรือรหัสโพสต์หากฉันจะแสดงผลเหล่านี้เป็น HTML ขออภัยที่ทำให้คุณสงสัยด้วยคำถามหนึ่งคำถาม
จอห์น

2
"คุณต้องหนีจากข้อมูลที่คุณไม่เชื่อถือ" - ฉันเห็นด้วยอย่างยิ่ง สิ่งเดียวที่ฉันต้องการเพิ่มคือการที่คุณไม่ควรไว้วางใจข้อมูล;)
เอียนดันน์

คำตอบ:


12

นี้ หน้า Codexอธิบายว่ามันสวยดีผมคิดว่า

esc_attrที่สำคัญมากที่สุดและใช้กันทั่วไปฟังก์ชั่นน่าจะเป็น ใช้ตัวอย่างนี้:

<a href="<?php print $author_url; ?>" title="<?php print $author_name; ?>"> 
  <?php print $author_name; ?>
</a>

หาก$author_nameมี"ตัวละครที่คุณปิดคุณลักษณะของคุณและหากตัวละครนั้นตามมาonclick="do_something();"มันอาจแย่ลง :)

การทำ print esc_attr($author_name)ตรวจสอบให้แน่ใจว่ามีการเข้ารหัสอักขระดังกล่าวและเบราว์เซอร์ไม่ทำสิ่งที่ไม่ควรทำ

มีกรณีหนึ่งที่คุณไม่ต้องการ: เมื่อคุณคาดหวังตัวเลขซึ่งในกรณีนี้คุณสามารถส่งข้อมูลอินพุตไปที่จำนวนเต็มตัวอย่างเช่น:

print (int)$_POST['some_number'];


ฟังก์ชั่น meta * ที่คุณอยู่ในรายการมีความระมัดระวังเกี่ยวกับการฆ่าเชื้ออินพุตสำหรับการจัดเก็บฐานข้อมูลดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับสิ่งนั้น

wpdb->prepare()วิธีการตอบสนองความต้องการที่จะใช้เมื่อคุณทำฐานข้อมูลแบบสอบถามด้วยตัวคุณเอง นี่คือตัวอย่าง:

$sql = $wpdb->prepare('
    UPDATE wp_posts SET post_title = %s WHERE ID = %d', 
      $_POST['title'], $_POST['id']);

$wpdb->query($sql);

%sและ%dคำหลักที่จะได้รับการแทนที่ด้วยค่า _POST $ สุขอนามัยของคุณ

ข้อผิดพลาดทั่วไปที่ฉันเห็นในปลั๊กอินจำนวนมากในที่เก็บ WP.org คือการส่งแบบสอบถามที่เตรียมไว้ไปแล้ว (และเตรียมไว้ไม่ดี) เช่น:

$wpdb->prepare('UPDATE wp_posts SET post_title = \''.$_POST['title'].' WHERE ...

อย่าทำสิ่งนี้ :)

นอกจากนี้การฆ่าเชื้อจะต้องทำแตกต่างกันเมื่อสะท้อน HTML ใน PHP เมื่อเทียบกับ PHP แบบอินไลน์ของ HTML หรือไม่?

ข้อความทั้งสองข้างต้นบรรลุในสิ่งเดียวกัน แต่พวกเขาต้องได้รับการ santized แตกต่างกันอย่างไร

เลขที่


ขอบคุณสำหรับอินพุตของคุณ คำอธิบายของคุณทำให้ฉันชัดเจนยิ่งขึ้น
จอห์น

ต้องการคำอธิบายเพิ่มเติมเล็กน้อย ถ้าฉันส่งสตริงไปยัง var (เช่น $ var = 'string';) ภายใน PHP และ echo เป็นแอตทริบิวต์ HTML ฉันจะฆ่า sanitize $ var เมื่อทำการสะท้อน หรือจำเป็นต้องฆ่าเชื้อเฉพาะในกรณีที่ฉันได้ดึงค่า $ var จากฐานข้อมูล
จอห์น

เมื่อสะท้อนบนหน้าจอไม่ทางใดก็ทางหนึ่ง
onetrickpony

ดังนั้นถ้าฉันเข้าใจคุณอย่างถูกต้องไม่ว่าฉันจะส่งสตริงไปยัง $ var ภายในโค้ด PHP หรือดึงข้อมูลจากฐานข้อมูลและส่งไปยัง $ var ทั้งคู่ต้องให้ฉัน esc ผลลัพธ์ แก้ไข?
จอห์น

ใช่ถ้าข้อมูลนั้นมาจากการป้อนข้อมูลของผู้ใช้เช่นเช่นชื่อของผู้เขียนความคิดเห็น หากโดย "ส่งผ่านสตริงไปยัง $ var ภายในโค้ด PHP" คุณหมายความว่าคุณได้กำหนดค่าที่คุณรู้จักให้กับตัวแปรแล้วแน่นอน - ไม่คุณไม่ต้องฆ่าเชื้อตัวแปรนั้น
onetrickpony

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.