从 UI WEB VIEW 请求时,IOS 是否添加 x-requested-with 标头?

Adi*_*tya 5 cocoa-touch uiwebview ios

从 UI WEB VIEW 请求时 IOS 是否添加 x-requested-with 标头?当您从 android 应用程序执行相同操作时,您可以看到 x-requested-with 标头已添加到以应用程序包名称作为值的请求中。

rol*_*ger 0

有多个答案,每个答案都取决于请求的类型。

由于 UIWebView 已退休,我将根据现在可用的 WKWebView (使用“cordova-plugin-ionic-webview”)来回答。

  1. 如果您的应用程序正在调用,<img ng-src="https://example.com/imageFile.png">则 iOS 不会附加任何有意义的标头信息。不Referrer,不Origin,绝对不X-Requested-With。对于 Android,这个相同的调用确实包含ReferrerOrigin

  2. 如果您的应用程序正在调用 a <ng-include src="https://example.com/somefile.txt">,则 iOS 会添加Origin标头,但不会添加ReferrerX-Requested-With。对于 Android,这个相同的调用确实包含ReferrerOrigin

还有其他调用 URL 的示例也表现出 #1 和 #2 的行为。

  1. 如果您的应用程序进行XMLHttpRequest$HTTP.get()调用,则 iOS 会添加Origin标头,但不会添加其他内容。Android 添加了ReferrerOrigin

在所有三个示例中,X-Requested-With都不是本地传递的。这是因为X-Requested-With可以被欺骗(所以可以Referrer);这可能就是为什么 iOS 本身不将它们包含在请求中的原因。但是,在示例 #3 中,您可以在进行 http 调用之前创建自己的标头 - 此时您可以添加除 之外的任何内容Origin。如果你尝试手动添加Origin来覆盖原生的,iOS 和 Android 都会发出警告并删除Origin标头中手动添加的部分。

我们在 API 服务器上实现了多项安全功能。其中之一是锁定某些 url 路径,以便只有我们的应用程序和我们的域可以访问这些路径和文件。这迫使我们重写应用程序的部分内容 -<img ng-src="...">必须编写任何使用的 html 页面来调用调用$http.get(),因为 iOS 本身就包含了Origin标头。如果没有,不传递任何相关的标头信息 (#1) 会导致我们的应用程序无法从该 url 路径加载图像/文件。

话虽如此,如果您需要X-Requested-With在服务器上进行某种(弱)安全检查,我不会选择X-Requested-With,而是使用Origin来帮助验证请求的来源。自定义浏览器和自定义代码仍然可以添加自己的Origin来欺骗源(就像 X-Requested-With 和 Referrer 一样),因此不要依赖它们中的任何一个来获得强大的安全性。帮助消除不需要的连接仍然是有效的 - 但真正的黑客可以毫不费力地绕过它。与其他方法结合使用有助于实现强大的安全性。

最后,特别是关于X-Requested-With在 iOS 上手动设置时出现的问题。我们不能依赖它,因为即使我们看到它在标头中传递,iOS 也会对其执行一些操作,使其无法被我们的服务器识别。X-Requested-With在 Android 设备上注入调用的代码$http.get()确实会被我们的服务器识别,但 iOS 上的相同代码不会被我们的服务器识别。我们一直无法弄清楚为什么我们的服务器访问 (.htaccess) 文件可以看到并匹配X-Requested-WithAndroid 设备上的标头,但在 iOS 上却不匹配。我们所有的调试都会将完整的标头吐出到控制台...我们看到X-Requested-With它的值是正确的,但由于某种原因,服务器没有对其进行匹配(对于 RewriteCond/RewriteRules)并拒绝连接。

更新:

经过大量研究,我终于找到了解决方案。将属性添加crossorigin="anonymous"到资源标签,这将强制Origin进入标头请求。请参阅:iOS 标准 http 调用不传递特定标头