จากมุมมองด้านความปลอดภัยควรหลีกเลี่ยง bloginfo () หรือ get_bloginfo () หรือไม่


10

ฉันได้รับการตรวจสอบข้อมูลจำนวนมากเกี่ยวกับการรักษาความปลอดภัย WP ธีมและปลั๊กอินและเข้าใจแนวคิดที่คุณควรหลีกเลี่ยงคุณลักษณะและค่า HTML ในชุดรูปแบบและปลั๊กอิน ฉันเคยเห็นbloginfo()และecho get_bloginfo()ใช้ทั้งมาตรฐานและภายในesc_html()หรือesc_attr()ฟังก์ชั่น

Genesisและ _sชุดรูปแบบพื้นฐานของ Automattic หนีทั้งค่าเหล่านี้ แต่คู่มือมาตรฐานชุดรูปแบบ codex ของ WP ไม่ได้พูดอะไรเกี่ยวกับการหลีกเลี่ยงค่าเหล่านี้ ฉันดูในรหัส WP (wp-includes/option.php) และดูเหมือนว่ามีการฆ่าเชื้อของค่าเล็กน้อยจากget_option()แต่ดูเหมือนว่ามีตัวกรองที่ปลั๊กอินสามารถเขียนทับสำหรับค่าบางอย่าง

ความจริงข้อนี้ทำให้ฉันคิดว่าควรจะหนีไป ใครช่วยสอนฉันเกี่ยวกับเรื่องนี้?

คำตอบ:


15

เราต้องมองลึกลงไปที่นี่เพื่อรับคำตอบสำหรับคำถามของคุณ

ดังนั้นเป็นรอบกระดาษห่อง่ายbloginfoget_bloginfo

<?php
function bloginfo( $show='' ) {
    echo get_bloginfo( $show, 'display' );
}

displayขอให้สังเกตอาร์กิวเมนต์ที่สอง เรามาดูกันว่ามีอะไรบ้าง

<?php
function get_bloginfo( $show = '', $filter = 'raw' ) {

    // snip snip, $output is fetched somewhere in here

    if ( 'display' == $filter ) {
        if ( $url )
            $output = apply_filters('bloginfo_url', $output, $show);
        else
            $output = apply_filters('bloginfo', $output, $show);
    }

    return $output;
}

หากตัวกรองถูกตั้งค่าdisplayเป็นเอาต์พุตของget_bloginfoจะถูกเรียกใช้ผ่านตัวกรอง

แทนที่จะใช้ hardcode คล้ายกับการเรียกใช้esc_htmlในฟังก์ชั่น WP ใช้ระบบ hook ของตัวเองเพื่อทำสิ่งต่างๆ สถานที่ที่จะค้นพบว่ามีอะไรเกิดขึ้นwp-includes/default-filters.phpบ้าง การค้นหาอย่างรวดเร็วสำหรับbloginfoในไฟล์นั้นเผยให้เห็น ...

<?php
// Format strings for display.
foreach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'widget_title' ) as $filter ) {
    add_filter( $filter, 'wptexturize'   );
    add_filter( $filter, 'convert_chars' );
    add_filter( $filter, 'esc_html'      );
}

bloginfoถูกซ่อนอยู่ในforeachอาร์เรย์ ในขณะที่คุณสามารถดูการส่งออกของได้รับการหนีไปกับbloginfoesc_html

ในคำอื่น ๆ นี้:

<?php
bloginfo('name');

เทียบเท่ากับสิ่งนี้:

<?php
echo esc_html(get_bloginfo('name'));

หรือสิ่งนี้:

<?php
echo get_bloginfo('name', 'display');

ดังนั้นbloginfoไม่จำเป็นต้องเอาท์พุทของ ไม่ไม่การส่งออกของตราบเท่าที่อาร์กิวเมนต์ที่สองมีการตั้งค่าget_bloginfodisplay

อย่างไรก็ตามข้อแม้คือทุกคนสามารถนำesc_htmlตัวกรองออกbloginfoได้ ดังนั้นจึงน่าจะปลอดภัยกว่าที่จะหลีกเลี่ยงเอาต์พุต และแน่นอนถ้าคุณกำลังใช้การส่งออกของbloginfoสำหรับสิ่งอื่นนอกเหนือจากการแสดง HTML (เช่น. ในแอตทริบิวต์ Alt ของภาพ) esc_attrคุณควรเรียกใช้ผ่าน


อาจเป็นการตรวจสอบรุ่นที่แนะนำให้ใช้ตัวกรอง อาจเป็น _s และแหล่งกำเนิดที่เผยแพร่ในเวอร์ชันเก่าที่ไม่มีรหัสนี้
Mark Kaplun

2
esc_htmlได้รับรอบตั้งแต่ 2.8 ดังนั้นจึงถูกตะขอเข้าbloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/ …
chrisguitarguy

คำตอบที่ยอดเยี่ยมขอบคุณ ฉันเพิ่งเข้ามาในความกล้าของ WP และถึงแม้ว่ามันชัดเจนสำหรับฉันว่า bloginfo เป็น wrapper ของ get_bloginfo มันไม่ชัดเจนว่าผลลัพธ์ถูกทำให้สะอาด ฉันพลาดตัวกรอง ฉันควรจะคุ้นเคยกับวิธีที่ WP จัดการโค้ดที่เข้าและออกจากฐานข้อมูล ฉันเหลือมุมมองที่คล้ายกันเหมือนตอนที่ฉันเริ่ม แต่อย่างน้อยฉันก็รู้ว่าทำไมตอนนี้ :)
พอลเกรแฮม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.