보안 관점에서 bloginfo () 또는 get_bloginfo ()를 이스케이프해야합니까?


10

WP 테마 및 플러그인 보안에 대한 많은 정보를 검토했으며 테마 및 플러그인에서 속성 및 HTML 값을 이스케이프해야한다는 개념을 이해했습니다. 나는 본 적이 bloginfo()echo get_bloginfo()표준과 내부 모두 사용 esc_html()또는 esc_attr()기능.

Automattic의 기본 테마 인 Genesis _s 는 이러한 값을 피하지만 WP의 자체 코덱 테마 표준 가이드는이 값을 벗어나는 것에 대해 아무 말도하지 않습니다. WP 코드 (wp-includes/option.php)를살펴 보았고전달 된 값에 약간의 위생 처리가있는get_option()것처럼 보이지만 플러그인이 특정 값을 덮어 쓸 수있는 필터가있는 것처럼 보입니다.

그것이 탈출해야한다고 생각하게 만드는 것은 바로이 사실입니다. 누구든지 이것을 밝힐 수 있습니까?

답변:


15

귀하의 질문에 대한 답변을 얻으려면 여기를 조금 더 깊이 살펴 봐야합니다.

따라서 bloginfo간단한 래퍼 get_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통해 실행됩니다.

esc_htmlWP는 함수에서 호출과 같은 것을 하드 코딩하는 대신 자체 후크 시스템을 사용하여 작업을 수행합니다. 해당 위치를 찾을 수있는 곳은에 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'      );
}

bloginfoforeach배열에 숨겨져 있습니다. 보시다시피,의 출력은 bloginfo로 이스케이프됩니다 esc_html.

다시 말해, 이것은 :

<?php
bloginfo('name');

이것과 동일합니다 :

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

아니면 이거:

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

따라서 아닙니다. 출력을 bloginfo이스케이프 처리 할 필요는 없습니다. 두 get_bloginfo번째 인수가로 설정되어 있는 한 출력도 마찬가지 display입니다.

그러나주의 할 점은 누구나 esc_html필터를에서 제거 할 수 있다는 것 입니다 bloginfo. 따라서 출력을 피하는 것이 더 안전합니다. 물론, bloginfoHTML 디스플레이 이외 의 용도로 (예 : 이미지의 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가 get_bloginfo 래퍼라는 것이 분명했지만 출력이 위생 처리되고 있음은 분명하지 않았다. 나는 필터를 놓쳤다. WP가 데이터베이스에 들어오고 나가는 코드를 처리하는 방법에 대해 더 잘 알고 있어야합니다. 나는 내가 시작했을 때와 비슷한 견해를 남겼지 만 적어도 나는 지금 왜 그런지 안다 :)
Paul Graham
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.