SameSite =无.htaccess正则表达式问题

时间:2020-02-15 12:52:25

标签: php regex google-chrome cookies samesite

最新的Chrome更新要求将跨域Cookie明确设置为SameSite = None。 .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 :(得分:0)

这应该可以解决osx 10.14.x上safari v13的问题

<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>

虽然还没有包括所有的铬块...