web-dev-qa-db-ja.com

ヘダの `content-type`をチェックする必要がありますか?

私が誰かが 彼らのウェブサイトのURLからHTTPとHTTPSプロトコルを削除したいと思ったところで私が答えるより古い質問がありました

add_action( 'plugins_loaded', 'output_buffering' );

function output_buffering() {
    ob_start( 'remove_protocols' ) );
}

function remove_protocols( $buffer ) {
    $content_type = NULL;
    foreach ( headers_list() as $header ) {
        if (strpos( strtolower( $header ), 'content-type:' ) === 0 ) {
            $pieces = explode( ':', strtolower( $header ) );
            $content_type = trim( $pieces[1] );
            break;
        }
    }
    if ( is_null( $content_type ) || substr( $content_type, 0, 9 ) === 'text/html' ) {
        $return = preg_replace( '~=\s*["\']\s*https?:(.*?)["\']~i', '="$1"', $buffer );
        if ( $return ) {
            $buffer = $return;
        }
    }
    return $buffer;
}

その結果、次のようになります。

<link rel='stylesheet' id='some-id'  href='//example.com/some/style.css' type='text/css' media='all' />
<script type='text/javascript' src='//example.com/some/script.js'></script>
<a href="//example.com" title="Some Title" rel="home">Some Link</a>
<img src="//example.com/some/image.jpg" alt="Some Alt" width="150" height="50" />

しかし、remove_protocols()関数を単純化しても同じ結果が得られます。

function remove_protocols( $buffer ) {
    $buffer = preg_replace( '~=\s*["\']\s*https?:(.*?)["\']~i', '="$1"', $buffer );
    return $buffer;
}

私の元の関数では、ヘッダのcontent-typeをチェックする必要がありますか?いくつかの調査をして、私は状況によって異なります Stack Overflow に似た質問を見つけました。これを読んでから、代わりに私の簡易版を使った方が安全だと思いますが、これを正しく理解していれば確認を得たいと思います。

その質問の文脈では、そうです。コンテンツタイプのヘッダを調べないと、提供されているものがHTMLページなのか画像なのかわからないので、正規表現が画像内の何かに一致することはほとんどありませんが、リスクがあります。

そのコードを書く別の方法は、RSS、json、xmlなどではなくhtmlページを扱っていることを100%近く保証するためにtemplate_redirectまたはさらにget_headerにフックすることです。ようこそ。

元の質問をもう一度見てみると、明らかに管理者ページでも同様にそれが必要になるでしょう。

OTOH、そしてこの質問とはあまり関係がありませんが、コンテンツが重複する問題を引き起こす可能性がある正規のURLのように、置き換えが多すぎることがあります。

1
Mark Kaplun