web-dev-qa-db-fra.com

Est-il nécessaire de vérifier `content-type` dans les en-têtes?

Il y avait une question plus ancienne à laquelle je répondais: quelqu'un voulait supprimer les protocoles HTTP et HTTPS des URL de son site Web :

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

En conséquence, cela donne:

<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" />

Cependant, j'ai simplifié la fonction remove_protocols() qui me donne les mêmes résultats:

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

Dans ma fonction d'origine, est-il nécessaire de vérifier content-type dans les en-têtes? En faisant des recherches, j'ai trouvé une question similaire sur Stack Overflow qui dépend de la situation. En lisant cela, je suppose qu’il serait sans danger d’utiliser ma version simplifiée à la place, mais je voudrais obtenir une confirmation si je comprends bien.

Oui, dans le contexte de cette question. Sans inspecter l'en-tête de type de contenu, vous ne savez pas s'il s'agit d'une page html ou d'une image. Même s'il est peu probable que l'expression régulière corresponde à quoi que ce soit dans une image, le risque existe.

une autre façon d’écrire ce code est de l’accrocher à template_redirect ou même à get_header pour être aussi sûr à 100% que vous avez affaire à des pages html et non à des flux RSS, json, xml, etc., pour lesquels cette transformation d’URL pourrait ne pas être requise ou même Bienvenue.

en repensant à la question initiale, il est évident que vous en voudrez également dans les pages d'administration ... alors peut-être que votre solution originale est la plus complète qui puisse être.

OTOH, et pas très lié à cette question, vous pourriez finir par remplacer trop, comme l'URL canonique qui pourrait créer un problème de contenu en double.

1
Mark Kaplun