【问题标题】:Is header('Content-Type:text/plain'); necessary at all?是 header('Content-Type:text/plain');有必要吗?
【发布时间】:2010-11-27 17:04:25
【问题描述】:

我还没有看到有或没有这个头部信息的任何区别。

【问题讨论】:

    标签: php http-headers content-type head response-headers


    【解决方案1】:

    定义“必要”。

    如果您希望浏览器知道文件的类型是什么,这是必要的。如果您不覆盖它,PHP 会自动将 Content-Type 标头设置为 text/html,因此您的浏览器会将其视为不包含任何 HTML 的 HTML 文件。如果您的输出包含任何 HTML,您会看到非常不同的结果。如果您要发送:

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

    Content-Type: text/html; charset=UTF-8 将以粗体和斜体显示在浏览器文本中:

    ✅ 好的

    Content-Type: text/plain; charset=UTF-8 会像这样在浏览器中显示:

    <b><i>✅ OK</i></b>
    

    TLDR 版本:如果您真的只输出纯文本,没有像 &lt;&gt; 这样的特殊字符,那么这并不重要,但它 错了。

    【讨论】:

    • 您能否提供有关 PHP 默认内容类型为 text/html 的声明的来源。我不反对,只是搜索说明此类的官方文档。
    • 在 php.ini 中搜索“default_mimetype”。那里的文档将声明“PHP 的内置默认值是 text/html”。不知道为什么,但他们实际上并没有在the manual 中说明。
    • 谢谢。实际上,我今天早些时候将此作为问题发布并了解了此设置。
    • 这是一个危险的建议。它确实真的很重要。以 text/html 形式发送用户控制的纯文本跨站脚本 (XSS) 攻击。
    • rjmunro 是正确的...对于用户提供的数据,您确实需要关心。原来的问题没有具体说明,所以我只是回答了这个问题。
    【解决方案2】:

    PHP 使用 Content-Type text/html 作为默认值,这与 text/plain 非常相似,这就解释了为什么您看不到任何差异。

    如果您想按原样输出文本(包括&lt;&gt; 符号),则需要text/plain content-type。

    例子:

    header("Content-Type: text/plain");
    echo "<b>hello world</b>";
    // Displays in the browser: <b>hello world</b>
    
    header("Content-Type: text/html");
    echo "<b>hello world</b>";
    // Displays in the browser with bold font: hello world
    

    【讨论】:

    • 您的 浏览器 默认不使用 text/html:PHP 会。
    • Corrected => "PHP 使用 Content-Type "text/html" 作为默认值。"
    • 该代码有一个小错误。它可以在一个和平的 HTTP 客户端上工作,但在标头名称和它的值之间必须有一个空格: header("Content-Type: text/html");
    • @Angel:已修复。谢谢。
    • 我不会说“text/html”与“text/plain”'非常相似' - 它非常不同。例如,如果您允许用户提供的文本到带有 text/html 的文件中,并且您没有将其正确编码为 html 实体,那么您就有了跨站点脚本攻击,即使该页面通常不会被访问。攻击者只需说服用户点击链接即可。
    【解决方案3】:

    告诉浏览器你发送什么类型的数据是非常重要的。区别应该很明显。尝试在浏览器中查看以下 PHP 文件的输出;

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

    你会看到:

    你好

    (请注意,如果您在这种情况下错过了标题行,您将得到相同的结果 - text/html 是 php 的默认值)

    将其更改为文本/纯文本

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

    你会看到:

    你好

    为什么这很重要?如果您在 php 脚本中有类似以下内容,例如,ajax 请求使用该脚本:

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

    有人可以在他们的网站上放置指向 http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script%3E 之类的 URL 的链接,如果用户点击它,他们就会将他们在您网站上的所有信息暴露给任何放置链接的人。如果您将文件作为文本/纯文本提供,那么您是安全的。

    请注意,这是一个愚蠢的示例,攻击者更有可能将错误的脚本标记添加到数据库中的字段或使用表单提交。

    【讨论】:

      【解决方案4】:

      设置 Content-Type 标头将影响 Web 浏览器如何处理您的内容。当大多数主流 Web 浏览器遇到 text/plain 的 Content-Type 时,它​​们会在浏览器窗口中呈现原始文本源(而不是在 HTML 中呈现的源)。这就是看到的区别

      <b>foo</b>
      

      此外,当使用XMLHttpRequest 对象时,您的 Content-Type 标头将影响浏览器如何序列化返回的结果。在接管 jQuery 和 Prototype 等 AJAX 框架之前,AJAX 响应的一个常见问题是 Content-Type 设置为 text/html 而不是 text/xml。如果 Content-Type 是 text/plain,可能会出现类似的问题。

      【讨论】:

        【解决方案5】:

        假设您想以 204: No Content HTTP 状态回答请求。 Firefox 将在浏览器的控制台中抱怨“找不到元素”。 这是 Firefox 中的一个错误,多年来一直被报告,但从未修复。 通过发送“Content-type: text/plain”标头,您可以防止在 Firefox 中出现此错误。

        【讨论】:

          【解决方案6】:

          不,不是这样,这是支持我的答案的示例---->明显的区别是可见的,当您使用 HTTP 压缩时,它允许您在从服务器到客户端传输时压缩数据,并且此数据的类型自动变为“gzip”,它告诉浏览器 bowser 获得了 压缩数据,它必须 upzip 它,这是类型真正重要的示例鲍泽。

          【讨论】:

          • 如果我错了,请解释一下,因为我真的想纠正我的知识并且真的很想学习..
          • 哦!对不起,它刚刚从我的脑海中溜走,但是如果你定义了 TYPE,你不同意吗,它允许你压缩一些选择性类型
          • 当然,您可以根据 MIME 类型进行选择性压缩(至少在 Apache 中可以),但没有理由不压缩基于文本的实体(除非请求方无法处理它)。
          猜你喜欢
          • 2011-12-14
          • 1970-01-01
          • 2017-01-22
          • 1970-01-01
          • 1970-01-01
          • 2012-05-19
          • 2016-10-03
          • 2012-12-14
          • 1970-01-01
          相关资源
          最近更新 更多