是否需要检查头部中的`content-type`?

时间:2016-10-02 作者:Ethan O\'Sullivan

我回答了一个老问题,有人想去哪里remove the HTTP and HTTPS protocols from the URLs on their website:

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 在标题中?做一些研究,我发现similar question on Stack Overflow 这取决于具体情况。通过阅读本文,我认为使用我的简化版本是安全的,但如果我理解正确,我希望得到确认。

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

就这个问题而言,是的。如果不检查内容类型标题,您就不知道所提供的是html页面还是图像,虽然正则表达式不太可能与图像中的任何内容匹配,但存在风险。

编写代码的另一种方法是将其挂接template_redirect 甚至get_header 几乎百分之百地确定您处理的是html页面,而不是RSS、json、xml等,对于这些页面,URL转换可能不需要,甚至不受欢迎。

再看看原来的问题,显然你也希望它出现在管理页面中。。。因此,您最初的解决方案可能是最全面的解决方案。

OTOH,并且与这个问题不太相关,您可能会以替换太多而结束,比如规范url,这可能会产生重复内容的问题。

相关推荐

Https://mydomain/wp-admin重定向至wp-login.php?redirect_to=https%3A%2F%2Fmydomain%2Fwp-admin%2F&reauth=1

无论何时我进入https://mydomain/wp-admin未登录时,我被重定向到wp-login.php?redirect_to=https%3A%2F%2Fmydomain%2Fwp-admin%2F&reauth=1 在一些帮助下,我创建了以下代码来重定向登录到wp的用户。要转发到所需自定义页面的php url:function redirect_wp_login_to_custom_login() { global $pagenow; $red