Подтвердить что ты не робот

Android Cordova App с IFrames Chrome 63 Нет запросов заголовков Cookies

С момента выхода Chrome 63 на Android, 6 декабря 2017 года, я столкнулся с проблемой, связанной с приложениями на базе Android от компании Cordova. Это приложение включает в себя IFrames, которые позволяют пользователям перемещаться по частям сайта электронной коммерции моих компаний из приложения.

Навигация между страницами, загруженными в IFrames , больше не отправляет информацию cookie в заголовки запроса.

Информация, такая как идентификаторы сеансов, которые хранятся в файле cookie, не передается на следующую страницу, что, в свою очередь, заставляет следующую страницу запускать совершенно новый сеанс пользователя!

Странно, однако, что любые вызовы AJAX, предварительно сформированные на странице в IFrames (например, для извлечения количества элементов в корзине) и запросов на ресурсы (css js, файлы изображений и т.д.), отправляют информацию cookie в заголовки запроса хорошо. Идентификатор сеанса в этих заголовках идентичен между страницами, что указывает на постоянство сеанса.

Файлы cookie создаются нормально, и я могу видеть их при использовании инструментов разработчика Chrome на панели приложений в домене компаний. Они просто не передаются на следующую страницу.

Я испытал эту проблему на устройстве Android 7.1.1. Когда я отключу приложение Chrome на этом устройстве, заголовки запросов файлов cookie в IFrames в приложении снова начнут работать нормально, возможно, веб-просмотр Кордовы больше не использует Chrome, когда он отключен?

Кто-нибудь знает, что может вызвать эту проблему? Может ли это быть связанным с кукисами SameSite или строгими изменениями изоляции сайта или другими изменениями, связанными с безопасностью в Chrome 63?

Проблема похожа на эту ошибку Chromium, которая была исправлена ​​в октябре 2016 года: https://bugs.chromium.org/p/chromium/issues/detail?id=634311

Однако в Webview есть файлы cookie сторонних разработчиков в классе SystemCookieManager библиотеки Cordova (Cordova Android 6.4.0):

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

Извините, если я не указал ничего достаточно ясно. Я рад предоставить дополнительную информацию, если кто-то может помочь с этой проблемой.

4b9b3361

Ответ 1

Эта ошибка была отправлена ​​и отправлена ​​в трекер Chromium Bug. По словам разработчиков Chromium, мы ничего не можем сделать со стороны приложения.

Ответ 2

Вот способ воспроизвести проблему без Кордовы. Он использует http://httpbin.org/cookies/set?k2=v2&k1=v1 для проверки файлов cookie. С Android System WebView против 63 cookies не отправляются. С предыдущими версиями они отправляются. Надеюсь, это поможет найти ответ на вопрос. Вот ссылка на полный проект Android: https://www.dropbox.com/s/s53wfy71uou11rh/test-webview.zip?dl=0

MainActivity.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(в папке с ресурсами)

<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(в папке с ресурсами)

html,
body,
iframe {
  width: 100%;
  height: 100%;
}

Ответ 3

Это была ошибка в Chrome, она исправлена. Я обновил Chrome снова, и теперь он отлично работает на моем устройстве.

Что мы можем извлечь из этого, так это то, что Кордова зависит от других приложений...

Ответ 4

Если ваш IFrame просматривает URL-адрес https, Chrome 63 генерирует предупреждение о безопасности, связанное с сертификатом SSL, созданным Symantec. В приложении "Кордова" не допускается больше навигации по IFrame.

См. ниже для получения дополнительной информации: https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html