带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie相关的知识,希望对你有一定的参考价值。

自从android 63上的Chrome 63发布以来,2017年12月6日,我遇到了我公司基于Cordova的Android应用程序的问题。此应用程序包含IFrame,允许用户从应用程序中导航我公司的部分电子商务网站。

IFrame中加载的页面之间的导航不再在请求标头中发送任何cookie信息。

存储在cookie中的诸如Session Ids之类的信息不会传递到下一页,这反过来会导致下一页开始一个全新的用户会话!

然而,奇怪的是,在IFrame上的页面中执行的任何AJAX调用(例如,检索篮子中的项目数)和资产请求(css js,图像文件等)确实在请求标头中发送cookie信息。这些标头中的会话ID在页面之间是相同的,表示会话持久性。

正在创建Cookie,我可以在公司域下的“应用程序”面板中使用Chrome开发人员工具时看到它们。他们只是没有被传递到下一页。

我在Android 7.1.1设备上遇到过这个问题。当我在此设备上停用Chrome应用时,应用中IFrame中的Cookie请求标头会再次正常工作,可能是Cordova Webview在禁用时不再使用Chrome?

有谁知道可能导致这个问题的原因?是否与Chrome 63中的SameSite cookie或严格的站点隔离更改或其他与安全相关的更改有关?

该问题与2016年10月修复的Chromium bug类似:https://bugs.chromium.org/p/chromium/issues/detail?id=634311

但是,Webview确实在Cordova库的系统CookieManager类中启用了第三方cookie(Cordova Android 6.4.0):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    cookieManager.setAcceptThirdPartyCookies(webView, true);            
}

如果我没有明确说明任何内容,请道歉。如果有人可以帮助解决这个问题,我很乐意提供更多信息。

答案

这个bug被提交并解决了in the Chromium Bug tracker。根据Chromium开发人员的说法,从App方面来看,我们无能为力。

另一答案

这是一种在没有Cordova的情况下重现问题的方法。它使用http://httpbin.org/cookies/set?k2=v2&k1=v1来测试cookie。使用Android System WebView v.63,不会发送cookie。使用以前的版本,它们会被发送我希望它可以帮助找到问题的答案。以下是完整Android项目的链接:https://www.dropbox.com/s/s53wfy71uou11rh/test-webview.zip?dl=0

main activity.Java

package com.example.mihai.twv;

import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.CookieManager;
import android.webkit.WebView;

import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWebView();
        loadWebView();
    }

    private void initWebView() {
        mWebView = (WebView) findViewById(R.id.webView);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            WebView.setWebContentsDebuggingEnabled(true);
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
        }
    }

    private void loadWebView() {
        String url = "http://httpbin.org";
        String html = getLocalFileContents("html/main.html");
        mWebView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null);
    }

    private String getLocalFileContents(String filepath) {
        String response = "";

        try {
            InputStream is = getAssets().open(filepath);
            int size = is.available();

            StringBuilder builder = new StringBuilder();

            byte[] buffer = new byte[size];
            while (is.read(buffer) != -1) {
                builder.append(new String(buffer, "UTF-8"));
            }
            is.close();
            response = builder.toString();
        } catch (Exception e) {
        }
        return response;
    }
}

html / main.html(在assets文件夹中)

<html>
<head>
    <base href="file:///android_asset/html/">
    <link type="text/css" rel="stylesheet" href="../css/main.css" />
</head>
<body>
    <iframe src="http://httpbin.org/cookies/set?k1=v1&k2=v2" frameborder="0"></iframe>
</body>

css / main.css(在assets文件夹中)

html,
body,
iframe {
  width: 100%;
  height: 100%;
}
另一答案

这是Chrome中的一个错误,它已被修复。我再次更新了Chrome,现在我的设备上运行正常。

我们可以从中学到的是Cordova依赖其他应用......

另一答案

如果您的IFrame在https网址上浏览,则Chrome 63会生成与Symantec生成的SSL证书相关联的安全警报。 Cordova应用程序不再接受IFrame中的导航

有关更多信息,请参见下文:https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html

以上是关于带有IFrames Chrome 63的Android Cordova应用程序无请求标题Cookie的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 63 中禁用自动填充 [重复]

使用 JS 获取选定的文本 - 即使在 iFrames 中

轮播内幻灯片的延迟加载内容(内容为oEmbeds/iframes)

在 iFrames 中使用字段自动在输入上输入键 Tab 到下一个输入

Chrome 63 - What"s New in DevTools(中文字幕)

chrome63以上版本浏览器都有哪些苹果系统