SameSite = Нет. Регулярное выражение .htaccess - PullRequest
0 голосов
/ 15 февраля 2020

Последнее обновление Chrome требует, чтобы для междоменных файлов cookie было явно задано значение SameSite = Нет. Следующее регулярное выражение для .htaccess работает за исключением OSX 10.14 Safari 13.0.5. (В этом браузере есть ошибка с SameSite = None), и его следует игнорировать.

<If "%{HTTP_USER_AGENT} !~ /(iPhone; CPU iPhone OS 1[0-2]|iPad; CPU OS 1[0-2]|iPod touch; CPU iPhone OS 1[0-2]|Macintosh; Intel Mac OS X.*Version\x2F1[0-2].*Safari)/i">
Header edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure</If>

Кто-нибудь знает, как изменить приведенное выше регулярное выражение, чтобы исключить версию Osx 10.14 Safari?

Кроме того, любой может объединить все дополнительные несовместимые клиенты в приведенное выше регулярное выражение - один регулярный выражения для устранения проблемы SameSite = None будет удивительным для всех! Спасибо

https://www.chromium.org/updates/same-site/incompatible-clients

    bool isSameSiteNoneIncompatible(string useragent):
    return hasWebKitSameSiteBug(useragent) ||
           dropsUnrecognizedSameSiteCookies(useragent)

bool hasWebKitSameSiteBug(string useragent):
    return isIosVersion(major:12, useragent) ||
           (isMacosxVersion(major:10, minor:14, useragent) &&
            (isSafari(useragent) || isMacEmbeddedBrowser(useragent)))

bool dropsUnrecognizedSameSiteCookies(string useragent):
    if isUcBrowser(useragent):
        return !isUcBrowserVersionAtLeast(major:12, minor:13, build:2, useragent)
    return isChromiumBased(useragent) &&
           isChromiumVersionAtLeast(major:51, useragent) &&
           !isChromiumVersionAtLeast(major:67, useragent)

// Regex parsing of User-Agent string. (See note above!)

bool isIosVersion(int major, string useragent):
    string regex = "\(iP.+; CPU .*OS (\d+)[_\d]*.*\) AppleWebKit\/"
    // Extract digits from first capturing group.
    return useragent.regexMatch(regex)[0] == intToString(major)

bool isMacosxVersion(int major, int minor, string useragent):
    string regex = "\(Macintosh;.*Mac OS X (\d+)_(\d+)[_\d]*.*\) AppleWebKit\/"
    // Extract digits from first and second capturing groups.
    return (useragent.regexMatch(regex)[0] == intToString(major)) &&
           (useragent.regexMatch(regex)[1] == intToString(minor))

bool isSafari(string useragent):
    string safari_regex = "Version\/.* Safari\/"
    return useragent.regexContains(safari_regex) &&
           !isChromiumBased(useragent)

bool isMacEmbeddedBrowser(string useragent):
    string regex = "^Mozilla\/[\.\d]+ \(Macintosh;.*Mac OS X [_\d]+\) "
                     + "AppleWebKit\/[\.\d]+ \(KHTML, like Gecko\)$"
    return useragent.regexContains(regex)

bool isChromiumBased(string useragent):
    string regex = "Chrom(e|ium)"
    return useragent.regexContains(regex)

bool isChromiumVersionAtLeast(int major, string useragent):
    string regex = "Chrom[^ \/]+\/(\d+)[\.\d]* "
    // Extract digits from first capturing group.
    int version = stringToInt(useragent.regexMatch(regex)[0])
    return version >= major

bool isUcBrowser(string useragent):
    string regex = "UCBrowser\/"
    return useragent.regexContains(regex)

bool isUcBrowserVersionAtLeast(int major, int minor, int build, string useragent):
    string regex = "UCBrowser\/(\d+)\.(\d+)\.(\d+)[\.\d]* "
    // Extract digits from three capturing groups.
    int major_version = stringToInt(useragent.regexMatch(regex)[0])
    int minor_version = stringToInt(useragent.regexMatch(regex)[1])
    int build_version = stringToInt(useragent.regexMatch(regex)[2])
    if major_version != major:
        return major_version > major
    if minor_version != minor:
        return minor_version > minor
    return build_version >= build

1 Ответ

0 голосов
/ 16 февраля 2020

Это должно исправить проблему для safari v13 на osx 10.14.x

<If "%{HTTP_USER_AGENT} !~ /(iPhone; CPU iPhone OS 1[0-2]|iPad; CPU OS 1[0-2]|iPod touch; CPU iPhone OS 1[0-2]|Macintosh; Intel Mac OS X.*Version\x2F1[0-2].*Safari|Macintosh;.*Mac OS X 10_14.* AppleWebKit.*Version\x2F1[0-3].*Safari)/i">
Header edit Set-Cookie ^(.*)$ $1;SameSite=None;Secure</If>

Хотя до сих пор не включены все исправления хрома ...

...