精华内容
下载资源
问答
  • <pre><code>header('HTTP/1.1 301 Moved Permanently'); header('Cache-Control: no-store, no-cache, must-revalidate'); header("Location: xxxxxx"); //Destination </code></pre> ... </div>
  • Ajax的标头是什么

    2018-01-04 08:38:44
    <p>What is Ajax's header's role? Why do we need this? <p>And in this specific case below, what cause the differences between with <code>xhttp.setRequestHeader()</code> and without?...
  • 今天编程序时遇到遇到一个错误,提示说找不到合适的标头位置停止点,后来我在前面加了一个#include"iostream"就好了,其实我不知道什么是标头文件以及标头文件停止点,上网查了查,大家都讲的好复杂和高深,想请大家...
  • 电子邮件的标头是这样的: ---------------------------------------------------------------- Subject: Re: Task Date: Thu, 4 Jan 2007 16:18:39 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed;...

    电子邮件的标头是这样的:
    ----------------------------------------------------------------
    Subject: Re: Task
    Date: Thu, 4 Jan 2007 16:18:39 +0800
    MIME-Version: 1.0
    Content-Type: multipart/mixed;
    boundary="----=_NextPart_000_053F_01C74082.081309A0"
    X-Priority: 3
    X-MSMail-Priority: Normal
    X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028
    ----------------------------------------------------------------
    其中boundary="----=_NextPart_000_053F_01C74082.081309A0"几乎在每封信中都有。但是每封信的NextPart都不一样。
    请问NextPart后面的串值由什么决定?
    是什么意思? 

    在Content-Type后面有一个boundary=/"XX-1234DED00099A/"参数。这个值用来分离邮件中的不同
    部分。它叫做MIME边界标记。边界标记的值必须尽可能的唯一,以免在超出邮件范围时发生混乱。
    /"警告/"信息(译者:指/"This is a MIME Encoded
    Message/")在那里是为了让不符合MIME的客户程序
    能够把它显示给用户,否则他们就不理解一个空白邮件是什么意思。

    boundary包含了边界标记,并且它是通过一个随机数进行了唯一化再做MD5哈希生成的

    他用来标识下一封mail

    展开全文
  • ...to help us having a similar twig philosophy with the extends.... ... * @var \Symfony\Bundle\FrameworkBundle\Templating\TimedPhpEngine $view * @var \Symfony\Bundle\FrameworkBundle\Templating\Helper\...
  • :red_question_mark: 为什么 不管您当前是否正在使用HTTP或IMAP (消息,电子邮件)创建/使用代码,都不必担心轻松访问标头和关联的属性,形容词或值。 我已经看到了很多代码试图处理这些头文件。 我经常看到这个...
  • HTTP主机标头漏洞

    2021-03-10 17:44:05
    最后,我们将提供一些有关如何保护自己的网站的一般指导。 主机头攻击 我们创建了许多实验室,这些实验室有意受到这些技术的...从HTTP / 1.1开始,HTTP Host标头是必需的请求标头。它指定客户端要访问的域名。例如,当


    一、HTTP Host请求

    1、什么是HTTP Host 请求头?

    Host 是 HTTP 1.1 协议中新增的一个请求头,它指定客户端要访问的域名。
    例如,当用户访问时https://www.baidu.com,域名和浏览器就组成一个包含Host标头的请求,如下所示:

    GET / HTTP/1.1
    Host: www.baidu.com
    

    在某些情况下,例如当请求已由中介系统转发时,主机值可能会在到达预期的后端组件之前进行更改。

    2、HTTP Host标头的目的是什么?

    HTTP Host标头的目的是帮助识别客户端要通信的后端组件。如果请求不包含Host标头,或者Host标头以某种方式格式不正确,则在将请求传入到预期的应用程序时可能会导致问题。

    基于云的解决方案和许多相关体系结构外包的不断增长,通常可以在同一IP地址访问多个网站和应用程序。这种方法的普及有部分原因是由于IPv4地址耗尽所致。

    当可以通过同一IP地址访问多个应用程序时,最常见的原因是以下情况之一。

    ①虚拟主机
    一种可能的情况是,单个Web服务器托管多个网站或应用程序,这可能是具有单个所有者的多个网站,也可能是将具有不同所有者的网站托管在单个共享平台上,在某些基于云的SaaS解决方案中仍然会发生。尽管这些不同的网站中的每一个都具有不同的域名,但是它们都与服务器共享一个公共IP地址,以这种方式在单个服务器上托管的网站称为“虚拟主机”。
    对于访问该网站的普通用户而言,虚拟主机通常与托管在其专用服务器上的网站是无法区分的。

    ②通过中介路由流量
    另一个常见的情况是,网站托管在不同的后端服务器上,但是客户端和服务器之间的所有流量都通过中介系统进行路由,这可能是一个简单的负载平衡器或某种反向代理服务器,在客户通过内容分发网络(CDN)访问网站的情况下,这种设置尤其普遍。
    在这种情况下,即使网站托管在单独的后端服务器上,它们的所有域名也都解析为中间组件的单个IP地址。这带来了与虚拟主机相同的挑战,因为反向代理或负载平衡器需要将每个请求路由到适当的后端。

    3、HTTP Host标头如何解决此问题?

    当浏览器发送请求时,目标URL将解析为特定服务器的IP地址。当该服务器接收到请求时,它参考主机头来确定预期的后端并相应地转发该请求。


    二、HTTP Host 攻击

    1、什么是HTTP主机标头攻击?

    HTTP Host 攻击利用易受攻击的网站,这些网站以不安全的方式处理主机请求头的值,如果服务器默认信任Host,但未能正确验证或转义它,则攻击者可能通过更改Host的值注入有害的有效负载,以此来操纵服务器端的行为。

    涉及直接将有效负载注入主机Host的攻击称为“HTTP Host 注入”攻击。

    标头值还可以用于网站基础结构的不同系统之间的各种交互。

    由于Host请求头是用户可控制的,如果没有正确地对输入进行转义或验证,可能会导致许多问题。
    Host标头是一系列其他漏洞的潜在利用载体,最值得注意的是:
    ①Web缓存中毒
    ②特定功能中的 业务逻辑缺陷
    ③基于路由的SSRF
    ④经典的服务器端漏洞,例如SQL注入

    2、HTTP Host Header漏洞如何产生?

    HTTP Host Header漏洞通常是由于错误的假设而造成的,即该标头不可由用户控制。即使攻击者可以使用Burp Proxy之类的工具轻松地修改主机标头,这也会在Host标头中创建隐式信任,并导致其验证或转义不足。

    即使可以更安全地处理Host标头本身,具体取决于处理传入请求的服务器的配置,也可以通过注入其他标头来覆盖Host。有时,网站所有者不知道默认情况下支持这些标头,因此,它们可能不会受到相同级别的审查。

    实际上,这些漏洞中大部分并不是由于编码不安全,而是由于相关基础架构中一个或多个组件的配置不安全,由于网站将第三方技术集成到其体系结构中,而不了解配置选项及其安全隐患,因此发生这些配置问题。


    三、如何识别HTTP Host标头漏洞

    使用到的工具主要是burpsuite之类的抓包工具。
    在我们抓到请求包之后,需要确定是否可以修改Host头,并且是否可以通过修改后的请求到达目标应用程序,并观察其对响应的影响。

    1、提供一个任意的主机头

    在探查主机头注入漏洞时,第一步是测试当修改Host为任意域名时发生的情况。

    一些拦截代理直接从Host标头获取目标IP地址,这时便无法测试,因为对标头所做的任何更改都只会导致将请求发送到完全不同的IP地址。但是,Burp Suite可以准确地保持主机标头和目标IP地址之间的分隔,这种分隔可以帮助我们在将Host修改为任意或格式不正确的Host标头,仍可以将请求发送到预期的目标。

    有时,即使提供了意外的Host标头,仍然可以访问目标网站,这可能是出于多种原因。例如,有时服务器会配置默认或后备选项,以防接收到无法识别的域名请求,如果目标网站碰巧是默认网站,在这种情况下,就可以开始研究应用程序对Host标头执行的操作以及此行为是否可利用。

    另一方面,由于Host标头是网站工作方式的基本组成部分,因此对其进行篡改通常意味着将根本无法访问目标应用程序。收到请求的前端服务器或负载平衡器可能根本不知道将请求转发到何处,从而导致某种Invalid Host header错误;如果目标是通过CDN访问的,那么出现这种的可能很大。

    在这种情况下,可以继续尝试以下方法:

    检查验证错误:
    大部分情况下我们会发现由于某种安全措施导致请求被阻止,出现Invalid Host header错误,而不是收到“ ”响应。
    例如,某些网站将验证Host标头是否与TLS握手中的SNI相匹配,但是这并不一定意味着它们不受主机标头攻击。
    这时应该尝试了解网站如何解析Host标头,有时,这可能会发现可用于绕过验证的漏洞。例如,某些解析算法将从Host标头中省略端口,这意味着仅域名被验证,此时,我们在域名后加上非数字端口,则可以保持域名不变,以确保您可以到达目标应用程序,同时有可能通过该端口注入有效负载。

    GET /example HTTP/1.1
    Host: vulnerable-website.com:bad-stuff-here
    

    其他站点将尝试应用匹配逻辑以允许任意子域。在这种情况下,您可以通过注册一个以与白名单中的字符相同的字符序列结尾的任意域名来完全绕过验证:

    GET /example HTTP/1.1
    Host: notvulnerable-website.com
    

    另外,您可以利用已经受到破坏的安全性较低的子域:

    GET /example HTTP/1.1
    Host: hacked-subdomain.vulnerable-website.com
    

    有关常见域验证缺陷的更多示例,请查看我们的内容,以规避常见的SSRF防御和Origin标头解析错误。

    2、发送不明确的请求

    验证主机的代码和对其进行脆弱处理的代码通常位于不同的应用程序组件中,甚至位于单独的服务器上。通过识别和利用它们在检索主机标头方面的差异,我们可以发出一个模棱两可的请求,该请求似乎具有不同的主机,具体取决于正在查看的系统。

    ①注入重复的主机头
    尝试添加重复的Host标头,这种方法通常只会导致请求被阻止,但是,由于浏览器不太可能发送此类请求,因此有时可能会发现开发人员没有预料到的情,在这种情况下,系统可能会返回一些意料之外的内容。

    不同的系统和技术将以不同的方式处理这种情况,但是通常会给两个标头界定优先级,从而有效地覆盖优先级较低的host,但是当系统不确定哪个标头是正确的标头时,这可能会导致差异,出现意外情况。
    考虑以下请求:

    GET /example HTTP/1.1
    Host: vulnerable-website.com
    Host: bad-stuff-here
    

    假设前端将优先级设置为标头的第一个实例,但后端则优先选择最终实例。在这种情况下,可以使用第一个标头来确保将请求发送到预期的目标,并使用第二个标头将有效负载传递到服务器端代码中。

    ②提供一个绝对URL
    同时提供绝对URL和Host标头引起的歧义也可能导致不同系统之间的差异,造成响应出现问题。

    GET https://vulnerable-website.com/ HTTP/1.1
    Host: bad-stuff-here
    

    有时,服务器的行为会有所不同,可能还需要尝试不同的协议,具体取决于请求行包含HTTP还是HTTPS URL。

    ③添加换行
    通过缩进带有空格字符的HTTP标头。某些服务器会将缩进的标头解释为换行,因此将其视为前一个标头值的一部分,其他服务器将完全忽略缩进的标头。

    由于这种情况的处理方式非常不一致,因此处理请求的不同系统之间通常也会存在差异。
    例如:

    GET /example HTTP/1.1
     Host: bad-stuff-here
    Host: vulnerable-website.com
    

    该网站可能会阻止带有多个主机标头的请求,但是可以通过缩进其中的一个缩略来绕过此验证。如果前端忽略缩进的标头,则该请求将作为的普通请求进行处理vulnerable-website.com。现在,假设后端在重复的情况下优先使用第一个标头,这种差异可能导致可以通过包装后的主机标头传递任意值。

    3、注入主机覆盖头

    即使不能使用歧义的请求覆盖Host标头,也有其他方法可以覆盖它的值,同时保持Host原封不动。这包括通过旨在满足此目的而设计的其他几个HTTP标头,通过这几个标头注入有效负载。

    通常可以通过某种中间系统(例如负载平衡器或反向代理)访问网站。在这种体系结构中,后端服务器接收的Host标头可能包含这些中间系统之一的域名。

    为了解决此问题,前端可以注入X-Forwarded-Host标头,其中包含来自客户端初始请求的Host标头的原始值。
    有时可以通过X-Forwarded-Host注入恶意输入,同时绕过Host标头本身的任何验证。

    GET /example HTTP/1.1
    Host: vulnerable-website.com
    X-Forwarded-Host: bad-stuff-here
    

    尽管这X-Forwarded-Host是此行为的事实上的标准,但是还有其他具有类似目的的标头,包括:

    X-Host
    X-Forwarded-Server
    X-HTTP-Host-Override
    Forwarded
    

    四、如何防止HTTP主机标头攻击

    1、为了防止HTTP Host标头攻击,最简单的方法是避免在服务器端代码中完全使用Host标头。仔细检查每个URL是否确实需要绝对的。经常发现,只能使用相对URL,这个简单的更改可以帮助防止Web缓存中毒漏洞。

    2、保护绝对网址
    当必须使用绝对URL时,应要求在配置文件中手动指定当前域,并引用此值而不是Host标头。这种方法将消除密码重置中毒的威胁。

    3、验证主机头
    如果必须使用Host标头,请确保正确验证它。包括对照允许的域白名单检查它,以及拒绝或重定向对无法识别的主机的任何请求。查阅框架的文档以获取有关执行此操作的指导。例如,Django框架ALLOWED_HOSTS在设置文件中提供了该选项。这种方法将减少遭受主机标头注入攻击的风险。

    4、不支持主机替代标头
    要检查是否不支持可能用于构造这些攻击的其他标头,尤其是X-Forwarded-Host。请记住,默认情况下可能支持这些功能。

    5、将允许的域名列入白名单
    为了防止对内部基础结构进行基于路由的攻击,将负载平衡器或任何反向代理配置为仅将请求转发到允许域的白名单。

    6、注意仅限内部使用的虚拟主机
    使用虚拟托管时,应避免将面向内部的网站和应用程序与面向公众的内容托管在同一服务器上。否则,攻击者可能可以通过主机标头操纵来访问内部域。


    参考:https://portswigger.net/
    展开全文
  • 好处:它增加了CORS标头! 为什么? 它可以防止跨域错误。 试试看: : 没有CORS标头: : 使用又名“ corsyfied”的CORS标头: ://corsify.me/http://shaky-library.surge.sh CORS-i-fy? 这怎么回事? 跨域...
  • 什么是 SimpleOAuth SimpleOAuth 一种为 API 调用创建 oAuth 授权标头的简单方法 要求 PHP 5+ 用法 基本用法 <?php require_once 'SimpleOAuth.php'; $oauth = new SimpleOAuth( 'your_app_consumer_key', ...
  • 我们的一些用户要求我们在我们发送请求的HTTP标头中包含与其帐户相关的数据,甚至是我们从API获得的响应。 在命名 , 格式化等方面添加自定义HTTP标头的一般惯例是什么? 另外,您可以随

    我们的一些用户要求我们在我们发送请求的HTTP标头中包含与其帐户相关的数据,甚至是我们从API获得的响应。 在命名格式化等方面添加自定义HTTP标头的一般惯例是什么?

    另外,您可以随意发布您在网上偶然发现的任何智能用途; 我们正试图用最好的目标来实现这个目标:)


    #1楼

    这个问题需要重新阅读。 所提出的实际问题与CSS属性中的供应商前缀不同,后者在未来的情况下以及对供应商支持和官方标准的考虑是合适的。 问的实际问题更类似于选择URL查询参数名称。 没有人应该关心它们是什么。 但是,自定义名称间隔是完全有效的 - 并且是常见且正确的 - 要做的事情。

    理由:
    它是关于开发人员之间关于定制,特定于应用程序的标题 - “ 与其帐户相关的数据 ” - 与供应商,标准组织或由第三方实施的协议无关的约定 ,除了有问题的开发人员只需要避免服务器,代理或客户端可能具有其他预期用途的标头名称。 出于这个原因,给出的“X-Gzip / Gzip”和“X-Forwarded-For / Forwarded-For”示例没有实际意义。 提出的问题是关于私有API上下文中的约定,类似于URL查询参数命名约定。 这是一个偏好和名称间距的问题; 没有“X”的任何代理或供应商支持“X-ClientDataFoo”的担忧显然是错误的。

    关于“X-”前缀没有什么特别或神奇之处,但它有助于明确它是一个自定义标题。 实际上,RFC-6648等帮助支持使用“X-”前缀的情况,因为 - 当HTTP客户端和服务器的供应商放弃前缀 - 您的应用程序特定的私有API,个人数据 - 传递机制变得更加绝对 - 与少量官方保留标题名称的名称空间冲突隔离。 也就是说,我的个人偏好和建议是更进一步,例如“X-ACME-ClientDataFoo”(如果您的小部件公司是“ACME”)。

    恕我直言,IETF规范没有足够具体来回答OP的问题,因为它无法区分完全不同的用例:(A)供应商一方面引入新的全球适用功能,如“Forwarded-For”,与(B) app开发人员将特定于应用程序的字符串传递给客户端和服务器。 该规范仅涉及前者(A)。 这里的问题是(B)是否有惯例。 有。 它们涉及按字母顺序将参数分组,并将它们与(A)类型的许多标准相关标题分开。 使用“X-”或“X-ACME-”前缀对于(B)来说是方便和合法的,并且与(A)不冲突。 对于(A),越多的供应商停止使用“X-”,(B)将变得越清晰。

    例:
    谷歌(在各种标准机构中占有一定的份量)是 - 截至今日,20141102,在我的回答的这个轻微编辑中 - 目前正在使用“X-Mod-Pagespeed”来表示其所涉及的Apache模块的版本转换给定的响应。 是否有人真的建议谷歌应该使用“Mod-Pagespeed”而不使用“X-”,和/或要求IETF保佑其使用?

    摘要:
    如果您在应用程序中使用自定义HTTP标头(作为有时适合的cookie替代方案)来向服务器传送数据或从服务器传递数据,并且这些标头明确地不打算在应用程序的上下文之外使用,使用“X-”或“X-FOO-”前缀对它们进行名称间隔是一种合理且通用的约定。


    #2楼

    2012年6月,对使用“X-”前缀的建议的弃用已成为RFC 6648的正式版本。 以下是相关的引用:

    3.对新参数的创建者的建议

    ...

    1. 不应该在其参数名称前加上“X-”或类似的结构。

    4.对协议设计者的建议

    ...

    1. 不应禁止注册具有“X-”前缀或类似结构的参数。

    2. 绝不能规定具有“X-”前缀或类似结构的参数需要被理解为非标准化。

    3. 绝不能规定没有“X-”前缀或类似结构的参数需要被理解为标准化。

    请注意,“不应该”(“不鼓励”)与“必须”(“禁止”)不同,请参阅RFC 2119以获取有关这些关键字的其他规范。 换句话说,您可以继续使用“X-”前缀标题,但不建议这样做,您也不能将它们记录为公共标准。


    2011年6月,发布了第一个IETF草案弃用了对非标准头文件使用“X-”前缀的建议。 原因是当前缀为“X-”的非标准头文件成为标准时,删除“X-”前缀会破坏向后兼容性,迫使应用程序协议支持这两个名称(例如, x-gzipgzip现在是等效的)。 所以,建议只是在没有“X-”前缀的情况下明智地命名它们。


    建议 与“X-”开始他们的名字。 例如X-Forwarded-ForX-Requested-With 。 这也在RFC 2047的第5节中提到。


    #3楼

    头字段名称注册表在RFC3864中定义,并且“X-”没有什么特别之处。

    据我所知,私有标题没有指导原则; 有疑问,避免它们。 或者查看HTTP扩展框架( RFC 2774 )。

    了解更多用例会很有趣; 为什么不能将信息添加到邮件正文中?


    #4楼

    HTTP标头的格式在HTTP规范中定义。 我将讨论HTTP 1.1,其规范是RFC 2616 。 在第4.2节“消息头”中,定义了头的一般结构:

       message-header = field-name ":" [ field-value ]
       field-name     = token
       field-value    = *( field-content | LWS )
       field-content  = <the OCTETs making up the field-value
                        and consisting of either *TEXT or combinations
                        of token, separators, and quoted-string>
    

    该定义基于两个主要支柱:令牌和TEXT。 两者都在第2.2节“基本规则”中定义。 令牌是:

       token          = 1*<any CHAR except CTLs or separators>
    

    反过来依靠CHAR,CTL和分隔符:

       CHAR           = <any US-ASCII character (octets 0 - 127)>
    
       CTL            = <any US-ASCII control character
                        (octets 0 - 31) and DEL (127)>
    
       separators     = "(" | ")" | "<" | ">" | "@"
                      | "," | ";" | ":" | "\" | <">
                      | "/" | "[" | "]" | "?" | "="
                      | "{" | "}" | SP | HT
    

    文字是:

       TEXT           = <any OCTET except CTLs,
                        but including LWS>
    

    LWS是线性空白区域,其定义我不会重现,而OCTET是:

       OCTET          = <any 8-bit sequence of data>
    

    该定义附有说明:

    The TEXT rule is only used for descriptive field contents and values
    that are not intended to be interpreted by the message parser. Words
    of *TEXT MAY contain characters from character sets other than ISO-
    8859-1 [22] only when encoded according to the rules of RFC 2047
    [14].
    

    那么,有两个结论。 首先,很明显,标题名称必须由ASCII字符的子集组成 - 字母数字,一些标点符号,而不是其他许多字符串。 其次,标题的定义中没有任何内容将其限制为ASCII或排除8位字符:它明确地由八位字节组成,仅禁止控制字符(注意CR和LF被视为控件)。 此外,对TEXT产生的评论暗示八位字节将被解释为在ISO-8859-1中,并且存在用于表示该编码之外的字符的编码机制(这是偶然的,可怕的)。

    因此,特别要回应@BalusC,很明显根据规范,标题值在ISO-8859-1中。 我已经在Tomcat的标题中发送了高8859-1个字符(特别是法语中使用的一些重音元音),并且让它们被Firefox正确解释,所以在某种程度上,这在实践和理论上都有效。 (虽然这是一个包含URL的Location标头,这些字符在URL中不合法,所以这实际上是非法的,但是在不同的规则下!)。

    也就是说,我不会依赖ISO-8859-1在所有服务器,代理和客户端上工作,所以我会坚持使用ASCII作为防御性编程的问题。


    #5楼

    RFC6648建议您假设您的自定义标头“可能在多个实现中变得标准化,公共,通常部署或可用”。 因此,建议不要在其前面添加“X-”或类似结构。

    但是,有一个例外“当你的标题极不可能被标准化时。” 对于这种“特定于实现和私有”的头,RFC表示诸如供应商前缀之类的命名空间是合理的。


    #6楼

    修改或更正确地添加额外的HTTP头是一个很好的代码调试工具,如果没有别的。

    当URL请求返回重定向或图像时,没有html“页面”暂时将调试代码的结果写入 - 至少不是浏览器中可见的。

    一种方法是将数据写入本地日志文件并稍后查看该文件。 另一种方法是临时添加反映正在调试的数据和变量的HTTP头。

    我经常添加额外的HTTP标头,如X-fubar-somevar:或X-testing-someresult:测试出来的东西 - 并且发现了许多本来很难追查的错误。

    展开全文
  • 是什么? tPNG的目标之一是:检索原始像素以立即使用而不会麻烦。 标头包含一个函数的一个定义,该定义返回32位RGBA编码像素的堆副本,这是面向图形的软件的通用格式。 如果您想快速开始使用PNG文件而不处理...
  • LSXAuthSwift用Swift编写的轻量级xAuth(OAuth 1.0a版本)授权标头生成器。 LSXAuthSwift可以与您可以在其中设置自定义标头的任何网络库一起使用。 示例项目正在使用Alamofire。 LSXAuthSwift使用Instapaper ...
  • 什么是跨域资源共享 (CORS)? CORS 一组标头,您可以在响应中设置,以声明其他来源(域)上的内容可以通过浏览器向您的网站发出通常不允许的某些请求(例如带有凭据的请求或 JSON POST) ),并读取来自这些跨域...
  • 用于向 Vapor 应用程序添加... 请注意,这个库不保证任何事情,也没有什么是完全安全的。 用法 添加包 将软件包作为依赖项添加到Package.swift清单中: dependencies : [ ... , . package ( url : " https://github.
  • 这些是什么? PHP与标头有什么关系? 为什么只能在任何输出之前发送它们? 常见原因 调用一种函数,该函数在通过print(),echo()等发送输出后,将标头信息发送给浏览器。 调用将标头信息发送到HTML...

    讨论事项:

    • 标头
      • 这些是什么?
      • PHP与标头有什么关系?
      • 为什么只能在任何输出之前发送它们?
    • 常见原因
      • 调用一种函数,该函数在通过print(),echo()等发送输出后,将标头信息发送给浏览器。
      • 调用将标头信息发送到HTML文件中的浏览器的函数
    • 不常见/难以定位(最烦人)的原因
      • 打开PHP解析器之前的空白(<?php)
      • 物料清单
    • 解决方案
      • 将标题发送功能移到任何输出之前
      • 输出缓冲
    PHP-常见的新手Pitfails

    本文是一系列(希望如此)许多文章的第一期。

    由PHP专家在bytes.com上撰写的这些文章希望涵盖PHP新手经常以清晰简洁的方式遇到的常见的陷阱,并随后在bytes.com论坛上提出。

    1.已发送标题
    警告:无法修改标头信息-第14行的C:\ xampp \ htdocs \ site \ php \ index.php中已经发送过的标头(输出从C:\ xampp \ htdocs \ site \ php \ index.php:1开始)
    - 常见错误消息。
    标头 是什么?

    当您给朋友写一封信时,在将该信发送给邮局之前,您需要在信封的正面提供一组详细信息:姓名,地址等。然后,邮局就可以使用该地址来向信到正确的位置。 是你吗

    如果不提供此信息,邮局将不太确定如何处理这封信(而且很有可能最终会落在垃圾箱中,但这在此无关紧要)。

    从这个意义上讲,标题是您打算写信的人的地址:邮局(网络浏览器)的一组信息/说明,它可以据此操作。

    因此,远离类推:标头是提供给网络浏览器的一组信息/指令,以便它可以对它们起作用。

    您最可能知道的常见标头是'mime-type'标头,如下所示:

    内容类型:text / html 此标头指示浏览器将其后(标头之后)的任何内容呈现为HTML文本。 如果您发送标头Content-type:text / xml ,那么浏览器将知道将文本呈现为XML (例如,在Firefox中 ,XML将以整洁的格式显示)。 PHP与它们有什么关系? PHP凭借其名称( PHP:超文本预处理器)非常与标头有关。 如果您曾经使用过C编程语言,那么您肯定会听说过C预处理程序 该工具将解析您的.c文件,并根据您的规则对其进行任何更改。 如果您#define IMG_X 100 ,预处理器将使用100更改所有出现的IMG_X 这实际上也是PHP所做的。 这与标题有什么关系? 好吧,这是包含标头(或可以这样做)的预处理之后发生的事情。 PHP将驻留在其缓冲区中的所有数据推送到Web浏览器。 因此,PHP能够将标头发送到浏览器。 为什么标头只能在输出之前发送/为什么不能在输出后进行修改?

    答案很简单:浏览器收到标头后,将无法识别任何后续标头,因此进行任何尝试都是毫无意义的。

    您可能还会问:

    好吧,这听起来并不那么危险-为什么PHP对此大惊小怪? 答案很简单:PHP核心中的某些功能依赖于将标头信息发送到浏览器的需要。 在介绍这些功能时,我们将对其进行更详细的介绍。 原因

    对于每个出现的问题,总是至少有两个原因,并且总是存在那些使自己更难发现的原因。

    常见原因。
    • session_start()

      根据我的经验,导致标题错误的最常见原因是在将输出发送到浏览器后调用session_start()函数。 令人反感的代码通常如下所示:
      
      <html>
          <head></head>
          <body>
          <h1>Starting session...</h1>
          <?php session_start(); ?>
          </body>
      </html> 
      session_start()函数是上述那些依赖于向浏览器发送标头信息的函数之一。

      为了实现会话,PHP需要在客户端的浏览器上创建一个cookie,该cookie将存储会话ID。 但是,正如我们之前发现的那样,如果输出已经发送到浏览器,则PHP无法将cookie标头发送到浏览器,因此对session_start()的调用失败。

      但是,session_start()不是具有此行为的唯一函数。 其他功能包括(不完整列表):
      *另一个常见错误是在发送输出后调用header()函数来重定向用户。 以下是另一位常犯:
      
      <html>
          <head></head>
          <body>
          <h1>Redirecting in 5 seconds...</h1>
          <?php
              header("refresh: 5; url=/page.html");
              // Or
              header("location: /page.html");
          ?>
          </body>
      </html> 
    • 另一个常见原因,实际上只是前面提到的原因的重复,是调用echo() *或print() *之类的函数,然后调用与标头相关的函数。 就像session_start()和header()示例一样,由于完全相同的原因,这将导致错误/警告。 一旦调用echo()或print(),就会发送标头(即第一次调用该函数),因此,您无法通过调用session_start()或header()等再次发送标头。
      
      <?php
          print 'This call to print() implicitly flushes the headers to the browser.';
          session_start(); // :(
      ?> 
      *从技术上讲,这些是语言构造而不是功能 -但这既不是这里也不是那里。
    联合国的常见原因。
    通常,调试是一项冗长而繁琐的任务。 程序员的调试技能可能是调试问题的最大能力。[...]

    -维基百科: 调试
    • BOM(字节顺序标记)

      字节顺序标记是一个字符序列,表示字节的排序方式。 要对其进行详细说明,将超出本文的讨论范围(并且不离题)。

      您需要知道的是,各种程序(通常是基于Windows的程序)将此字符序列添加到文件的开头 当PHP打开此文件时,它会看到字符并认为自己可以,我们有一些输出要发送到浏览器! 然后头被隐式刷新,然后发送内容。

      因此,如果您在该文件中有任何对诸如header()之类的函数的调用,您将遇到该熟悉的错误。
    • 打开PHP标记前的空白

      这是一个比BOM表问题更常见的问题,并且更容易发现,但仍然令人沮丧,尽管错误的产生原因完全相同:打开PHP标记(<?php) 之前的任何内容都将被视为输出并发送至浏览器,从而也刷新标题。
    解决方案

    实际上,解决方案非常简单,并且通常是相同的。

    正如我们从所有原因中看到的那样,当内容被有意或无意地发送到浏览器时,就会出现错误。 由此我们可以推断出解决方案是

    发送标头之前发送任何输出。 考虑以下示例:
    • session_start()

      我们之前看到在输出一些HTML之后开始会话会导致问题:

      
      <html>
          <head></head>
          <body>
          <h1>Starting session...</h1>
          <?php session_start(); ?>
          </body>
      </html> 
      如果将对session_start()的调用移到文件的开头,则不会看到任何错误!

      
      <?php session_start(); ?>
      <html>
          <head></head>
          <body>
          <h1>Starting session...</h1>
          </body>
      </html> 
    • 打开PHP标记前的空白

      一个非常简单的解决方法-删除空格! 有时它并不明显,所以一定要仔细看!

      
       <?php // notice there _is_ a space before the opening PHP tag.
      session_start();
      ?> 
    • 物料清单

      因此,解决方案不像简单地删除任何空格或将函数调用移动到文件的开头那样简单,因为将这些字符放入文件中的文本编辑器也使它们不可见! 另外,所有文本编辑器的解决方案也不相同。 因此,我将为您提供Google的搜索关键字: 删除BOM <在此处插入文本编辑器名称>
    输出缓冲

    有时您可能会发现,在大型代码库上,重组代码以减轻这些错误可能会非常耗时。 因此,您需要快速修复。

    输出缓冲可能正是您所需要的。

    输出缓冲的功能与锡盒上所说的一样:缓冲(存储)您的输出,直到准备好刷新(发送)它为止。 使用这种技术,您可以像这样缓冲一块代码:

    
    <?php 
    /** Kick start output buffering */
    ob_start(); 
    /** Send some output */
    print 'Sending output!'; 
    /** Call a header-dependant function */
    session_start(); 
    /** flush the buffer contents */
    ob_end_flush(); 
    现在,您可能已经想好了,PHP也不会缓冲标头吗? 答案是:不会。 输出缓冲功能不会影响需要发送头的任何功能,这就是它的美! 结论

    所以,你去了。 我知道这篇文章比我预期的要全面,但是没关系。

    愿消息来源与您同在,

    马克·斯基贝克(Mark Skilbeck)。

    附言:请提及所有拼写/语法错误以及任何不正确的信息。

    From: https://bytes.com/topic/php/insights/876324-php-common-newbie-pitfalls-1-headers-already-sent

    展开全文
  • 简而言之,GLM更常用的库之一,它也标头的,但仅与C ++兼容。 第一次发现OpenGL时,我面临的最困惑的事情之一,尽管它C API,但我从未见过一个涵盖使用C的OpenGL的教程/指南/参考。 据我了解,这样做的...
  • 我们将概述识别主机标头漏洞...从HTTP / 1.1开始,HTTP Host标头是必需的请求标头。它指定客户端要访问的域名。例如,当用户访问时https://portswigger.net/web-security,他们的浏览器将组成一个包含Host标头的请求,
  • 这就是为什么在本次演讲中,我将向您介绍如何使网络更安全,更快速的现代方式。 Christian Schaefer( ),被称为“ Schepp”,来自德国杜塞尔多夫的自由前端开发人员。 他没有像几乎所有其他前端开发人员当前...
  • 是什么? 粘性创建按需的粘性标题。 指定何时要固定标题,而其余的则是不可思议的。 入门 # Get the latest snapshot $ git clone git@github.com:pinceladasdaweb/sticky.git 如何使用? Sticky是一个没有依赖...
  • 头部中间人 ...它是什么样子的? 超酷 我如何贡献? 这个项目使用 React、Babel、Gulp 和 Browserify,因为现在 JS 非常愚蠢。 这将安装所需的东西并启动gulp watch $ npm install -g babel && npm start
  • 是什么? 使用Boost Software License 1.0的C ++ 11/14的线程安全的仅标头模拟框架 文献资料 烹饪书 常问问题 向后兼容早期版本的C ++ Trompeloeil的平台和库支持 参考 此外,请继续阅读有关排序的文章,以获取...
  • 您可以使用功能齐全的插件来添加安全标头,但是为什么不必添加额外的开销呢? 修改默认的WordPress行为时,几乎总是最好使用一次性插件。 这样可以确保在发生更新或切换主题时更改仍然存在。 这就是必须使用的...
  • 是什么 OZO是用于与PostgreSQL DBMS异步通信的C ++ 17库。 该库利用模板元编程的功能,提供从C ++类型到SQL的便捷映射以及丰富的查询构建可能性。 OZO在后台使用Boost.Asio支持不同的并发范例(回调,期货,协程)...
  • 要了解为什么您真的需要设置内容安全策略标头,请阅读。 设置内容安全策略标头有助于解决此问题。 这些标题决定了允许您的网站联系哪些网站。 该软件包使您可以轻松设置正确的标题。 本自述文件并不旨在全面解释...
  • flextGLOpenGL和Vulkan标头和加载器生成器。 它与其他类似系统有点不同: 完全控制公开的版本和扩展 直接从OpenGL / Vulkan注册表gl.xml / vk.xml文件生成的绑定 对于OpenGL,可以选择仅导出核心配置文件功能 ...
  • 固定插件以设置Referrer-Policy HTTP标头什么? 您可能知道使用的。 您也可以将其用作fastify的中间件。 那么,为什么我做了这个插件? 您可能会在找到原因,并希望您喜欢它。 :) 区别 此插件已通过所有测试...
  • 现在的新浏览器都支持压缩了,因此如果网站启用了GZip,可以无需再指定“Vary: Accept-Encoding”标头,不过指定“Vary: Accept-Encoding”标头会有更高的保险,而它并不需要你额外的开销,为什么不指定呢?下面...
  • 固定插件以设置Content-Security-Policy标头。 为什么? 您可能知道使用的。 您也可以将其用作fastify的中间件。 那么,为什么我做了这个插件? 您可能会在找到原因,并希望您喜欢它。 :) 区别 该插件已通过...
  • 在webkaka的网站速度诊断性能优化里有一项叫指定“Vary:Accept-Encoding”标头,可能很多人不太明白这是什么意思,不知道它对网站的影响有多大,不知道如何进行优化,为此,本文将给大家阐述下“Vary:Accept-...
  • 基于仅标头的计算着色器的曲线库。 当前状态 这个项目(至少到目前为止)只是一个概念证明。 不进行错误检查,只能创建三次B样条曲线。 名字叫什么Casteljau的损坏版本(可以从de Casteljau的算法中了解它)。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 613
精华内容 245
关键字:

标头是什么