【问题标题】:Why use strtolower to verify $_SERVER['HTTP_X_REQUESTED_WITH']?为什么要使用 strtolower 来验证 $_SERVER['HTTP_X_REQUESTED_WITH']?
【发布时间】:2013-09-12 15:29:36
【问题描述】:

这样检查 XHR 的代码非常常见:

if (
     isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&      
     strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
) {
    // ajax happened
}

为什么这里总是使用strtolower 而不仅仅是与XMLHttpRequest 进行比较?这只是偏执狂还是有真正的原因?

【问题讨论】:

  • 某些框架等可以在没有“正确”字符大小的情况下发送该字符串。如果您确定您的代码针对“xmlhttprequest”发送“XMLHttpRequest”,则可以简化该行。
  • @WesleyMurch — 您是否正在编写通过 CORS 跨域访问的服务?或者您是否有不属于您团队的前端开发人员?
  • @Quentin 为了便于讨论,是的。
  • 要问的问题是:您是否 100% 世界上所有现有的浏览器都发送正确的大小写,并且所有现有的 Web / 代理 / 缓存服务器都保持大小写不变。如果没有,那么最好这样做。
  • 由于到目前为止的cmets,我现在相信我对HTTP_X_REQUESTED_WITH有一个根本的误解。这个值从哪里来,在什么时候可以修改?

标签: php ajax xmlhttprequest


【解决方案1】:
请求中的

HTTP 标头 始终由客户端包含。客户端可以是 shell 脚本、浏览器或由 Javascript 或 Javascript 框架触发的 Ajax 调用。 Ajax 中的“j”代表 Javascript,但其 HTTP 请求可以用任何其他脚本或程序创建。

来自Common non-standard request headers

X-Requested-With:主要用于识别Ajax请求。大多数 JavaScript 框架都会发送带有 XMLHttpRequest XMLHttpRequest 值的标头。

所有以X-开头的头都是非标准头,也就是说没有官方文档定义它们的值。

来自https://www.rfc-editor.org/rfc/rfc6648

从历史上看,应用程序协议的设计者和实现者
经常区分标准化和非标准化
通过在非标准化参数的名称前加上
字符串 "X-" 或类似的结构。

HTTP 协议不是固定的或静态的,只有您应该遵循的标准。

您甚至可以创建自己的 HTTP 请求并放入单独的标头,例如:

X-Requested-With: MySuperCURLScript
X-MyOwnHeader: Cool!

要回答您的问题,如果一个客户端发送标头 X-Requested-With: XMLHttpRequest,另一个发送 X-Requested-With: xmlHttpRequest,您可以简单地将它们全部小写,并确保不要错过不同的符号。就这么简单!

安全方面:标头及其内容只是信息,而不是您应该 100% 依赖的东西。如果您深入了解 CURL 或“使用 php 发送 http 标头”的 Google 结果,您会很快发现任何信息都可以轻松发送和伪造。 HTTP 标头经常被滥用来入侵服务器,通过发送操纵的 cookie(- cookie 是一个标头,很简单:Cookie: ...)、操纵文件信息(上传一个伪造的 gif,它是一个 exe 文件等)、操纵会话数据,POST / 请求数据。

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多