たまにはマジメな話

こんにちワニ、放談の時間です。

NFLと無関係な話ですが、今日は世間を騒がせている問題に取り組みたいと思います。

[SPONSORED LINK]

Google Chrome (グーグルクローム) 80問題とは?

まず何が世間を騒がせているかを説明しますと、天下のGoogleさんが

「Google Chrome80から、ドメインが違うサイトとはクッキーを使ったやり取りができなくなるよん」

というお達しを出したのです。

つまり、ブラウザのセキュリティを強化することで、悪質な攻撃からユーザーを守るという事なのです。

 

しかし、問題なのが既にクッキーを使って違うドメインで情報を受け渡しを行っているサイトが世間に山ほどあること。

Chrome80にバージョンUPしても、すぐにこのセキュリティ強化の設定にはならず、一部のユーザーから徐々に広めていく計画のようですが、いずれは全てのChromeで普通では異なるサイトどうしでクッキーの受け渡しができなくなります。

 

この話、かなり前に発表されたのですが、施行される直前になってどれだけヤバイ事かに世間が気づいて、一部で混乱を生んでいます。

実際、PHPではどうするのよ?

詳しい話は他のサイトで解説してるので割愛し、みんな直球で知りたいのは、どうやって対応するかでしょう。

PHPかつsetcookieでsamesite属性をつけるプロパティが無いPHP7.2以下やPHP5.X でやるならば、ずばり答えはこうだと思います。

追記2020/2/26:

ios12、mac 10.14+safari は、samsesite=None をセットするとバグで逆にsamesite=Strict に設定するとのことで、それらの端末は処理しない分岐を入れました。

クッキー再設定例1)
cookieSet_SamesiteNone("test1");
再設定例2)
cookieSet_SamesiteNone("test2",time() + 3600 * 24 * 5);

function cookieSet_SamesiteNone($name,$expire = 0){
$blnHttps = isset($_SERVER['HTTPS'])? $_SERVER['HTTPS'] : NULL;
if($blnHttps){ //httpsのみ処理
$ua=$_SERVER['HTTP_USER_AGENT'];
echo "<br/>".$ua."<br/>";
if(!preg_match( //バグのあるOSにSameSite=Noneは処理しない
//iPhone,iPodの場合
'/(CPU\siPhone\sOS\s1[0-2]|'.
//iPadの場合
'iPad;\sCPU\sOS\s1[0-2]|'.
//MacでSafari12以下の場合
'Macintosh;\sIntel\sMac\sOS\sX.*Version\/1[0-2].*Safari|'.
//Mac10.14でSafari13以下の場合
'Macintosh;.*Mac\sOS\sX\s10_14.*\sAppleWebKit.*Version\/1[0-3].*Safari'.
')/i',$ua)){
if(isset($_COOKIE[$name])){ //定義されているか確認
echo "セット:".$name."<br/>";
setcookie($name,$_COOKIE[$name] ,$expire, "/;samesite=None","",1); //samesite=None ,secure属性
}
}else{
echo "<br/>対象外:".$name."<br/>";
}
}
}

 

上記の例では、すでに設定されているcookie名「test1」と「test2」にsecure属性とsamesite属性を追加しています。

まず、SSLが効かないローカル環境でもcookieを効かすために、非SSL環境下ではセットしません。

一部のサイトでheader関数を使う事を書いていましたが、header(Set-cookie)だと前に書いたcookieを全消しするようです。

 

さぁ、これで大丈夫。(だと思う)

ちなみに質問は受け付けませんので、あしからず。

m(_  _)m