web-dev-qa-db-ja.com

is header( 'Content-Type:text / plain');まったく必要ですか?

このヘッド情報の有無にかかわらず、まだ違いは見られませんでした。

56
omg

「必要」を定義します。

ブラウザでknowにファイルの種類を指定する必要があります。 PHPは自動的にContent-Typeヘッダーをtext/htmlに設定します。これをオーバーライドしないと、ブラウザーはHTMLを含まないHTMLファイルとして処理します。出力にHTMLが含まれている場合、結果はまったく異なります。送信する場合:

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

Content-Type: text/htmlは次を出力します。

test

一方、Content-Type: text/plainは次を出力します。

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

TLDRバージョン:実際にテキストのみを出力している場合、それは実際には重要ではありませんが、間違っています。

102
Jeremy Logan

PHPは、デフォルトとしてContent-Type "text/html"を使用します(これは "text/plain"と非常によく似ています)。これにより、違いが見られない理由が説明されます。 text/plainは、テキストをそのまま出力する場合に必要です(<>記号を含む)。例:

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

送信するデータのタイプをブラウザに伝えることは非常に重要です。違いは明らかです。ブラウザで次のPHPファイルの出力を表示してみてください。

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

表示されます:

こんにちは

(この場合、ヘッダー行を見逃しても同じ結果が得られることに注意してください-text/htmlはphpのデフォルトです)

Text/plainに変更します

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

表示されます:

<p>こんにちは</ p>

なぜこれが重要なのですか?たとえば、ajaxリクエストで使用されるphpスクリプトに次のようなものがある場合:

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

誰かが http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/scriptのようなURLへのリンクを置くことができますサイトで%3E をクリックします。ユーザーがクリックすると、リンクを張った人にサイト上のすべての情報が公開されます。ファイルをtext/plainとして提供する場合、安全です。

これはばかげた例であり、攻撃者がデータベースのフィールドに、またはフォーム送信を使用して、不正なスクリプトタグを追加する可能性が高いことに注意してください。

11
rjmunro

Content-Typeヘッダーを設定すると、Webブラウザーがコンテンツを処理する方法に影響します。ほとんどの主流のWebブラウザーは、text-plainのContent-Typeに遭遇すると、ブラウザーウィンドウに生のテキストソースをレンダリングします(HTMLでレンダリングされるソースとは対照的です)。それは見ることの違いです

<b>foo</b>

または

foo

さらに、XMLHttpRequestオブジェクトを使用すると、Content-Typeヘッダーは、ブラウザーが返された結果をシリアル化する方法に影響します。 jQueryやPrototypeのようなAJAXフレームワークを引き継ぐ前は、AJAX応答の一般的な問題は、text/xmlではなくtext/htmlに設定されたContent-Typeでした。 Content-Typeがtext/plainの場合、同様の問題が発生する可能性があります。

7
Alan Storm

204:Content No HTTPステータスでリクエストに応答するとします。 Firefoxは、ブラウザのコンソールで「要素が見つかりません」と文句を言います。これはFirefoxのバグであり、数年間報告されていますが、修正されていません。 「Content-type:text/plain」ヘッダーを送信することにより、Firefoxでこのエラーを防ぐことができます。

1
reggie

そのようなことはありません、ここに私の答えのサポートの例があります---->明確な違いは、サーバーからクライアントへの移動中にデータを圧縮できるHTTP圧縮に行くと見えますこのデータは自動的に "gzip"になり、ブラウザにbowserがzipされたデータを取得し、pzip itを取得する必要があることをブラウザに伝えます。これはTypeがBowserで本当に重要な例です。

0
Ashish Agarwal