Từ quan điểm bảo mật, có nên thoát bloginfo () hoặc get_bloginfo () không?


10

Tôi đã xem xét nhiều thông tin về bảo mật plugin và chủ đề WP và hiểu khái niệm rằng bạn nên thoát các thuộc tính và giá trị HTML trong các chủ đề và plugin. Tôi đã thấy bloginfo()echo get_bloginfo()sử dụng cả tiêu chuẩn và bên trong một esc_html()hoặc esc_attr()chức năng.

Cả Genesis _s , chủ đề cơ sở của Automattic đều thoát khỏi các giá trị này nhưng hướng dẫn tiêu chuẩn chủ đề codex riêng của WP không nói gì về việc thoát khỏi các giá trị này. Tôi đã xem xét mã WP (wp-includes/option.php) và có vẻ như có một chút vệ sinh các giá trị được truyền từget_option()nhưng cũng có vẻ như có một bộ lọc mà plugin có thể ghi đè lên các giá trị nhất định.

Đó là thực tế này dẫn tôi đến suy nghĩ rằng nó nên được trốn thoát. Bất cứ ai có thể khai sáng cho tôi về điều này?

Câu trả lời:


15

Chúng ta phải nhìn sâu hơn một chút ở đây để có câu trả lời cho câu hỏi của bạn.

Vì vậy, bloginfolà một gói đơn giản xung quanh get_bloginfo.

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

Lưu ý đối số thứ hai display. Hãy xem những gì nó làm.

<?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;
}

Nếu bộ lọc được đặt thành displayđầu ra của get_bloginfothì chạy qua bộ lọc.

Thay vì mã hóa một cái gì đó giống như một cuộc gọi đến esc_htmltrong một chức năng, WP sử dụng hệ thống hook riêng của nó để thực hiện mọi việc. Nơi để tìm thấy rằng nơi đó xảy ra là trong wp-includes/default-filters.php. Một tìm kiếm nhanh bloginfotrong tập tin đó cho thấy ...

<?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được ẩn trong foreachmảng. Như bạn có thể thấy, đầu ra của bloginfođược thoát với esc_html.

Nói cách khác, điều này:

<?php
bloginfo('name');

Tương đương với điều này:

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

Hoặc này:

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

Vì vậy, không, đầu ra của bloginfokhông cần phải thoát. Không có đầu ra get_bloginfonào miễn là đối số thứ hai được đặt thành display.

Tuy nhiên, cảnh báo là bất cứ ai cũng có thể loại bỏ esc_htmlbộ lọc khỏi bloginfo. Vì vậy, nó có thể an toàn hơn chỉ để thoát khỏi đầu ra. Và, tất nhiên, nếu bạn đang sử dụng đầu ra bloginfocho bất cứ thứ gì ngoài màn hình HTML (ví dụ: trong thuộc tính alt của hình ảnh), bạn nên chạy nó qua esc_attr.


Có thể đáng để kiểm tra phiên bản sử dụng bộ lọc đã được giới thiệu. Có thể là _s và genesis được xuất bản trong phiên bản cũ hơn không bao gồm mã này.
Đánh dấu Kaplun

2
esc_htmlđã bắt đầu từ ngày 2.8, vì vậy nó đã được nối vào bloginfo github.com/WordPress/WordPress/blob/2.8-branch/wp-includes/iêu
chrisguitarguy

Câu trả lời tuyệt vời, cảm ơn. Bây giờ tôi chỉ mới tham gia vào WP và mặc dù rõ ràng với tôi rằng bloginfo là một trình bao bọc get_bloginfo, không rõ là đầu ra đang được khử trùng. Tôi đã bỏ lỡ các bộ lọc. Có lẽ tôi nên làm quen với cách WP xử lý mã nhập và rời khỏi cơ sở dữ liệu. Tôi rời đi với một viễn cảnh tương tự như khi tôi bắt đầu nhưng ít nhất tôi biết tại sao bây giờ :)
Paul Graham
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.