จะแก้ไขคำเตือน“ ตั้งค่าคุกกี้ SameSite เป็น none” ได้อย่างไร ส่วนขยายของ Chrome


41

ฉันสร้างส่วนขยายของ Chrome และจาก popup.js ฉันเรียกว่าสคริปต์ PHP (ใช้ Xhttprequest) ที่อ่านคุกกี้ แบบนี้:

$cookie_name = "mycookie";

if(isset($_COOKIE[$cookie_name]))
{
    echo $_COOKIE[$cookie_name];
}
else{
    echo "nocookie";
}

แต่ฉันได้รับคำเตือนนี้เมื่อเกิดข้อผิดพลาดในส่วนขยาย

คุกกี้ที่เชื่อมโยงกับทรัพยากรข้ามไซต์ที่ (นี่คือโดเมนของฉัน) ถูกตั้งค่าโดยไม่มีSameSiteแอตทริบิวต์ ปล่อยอนาคตของ Chrome จะส่งคุกกี้ที่มีการร้องขอข้ามไซต์ถ้าพวกเขาถูกกำหนดด้วยและSameSite=None Secureคุณสามารถตรวจสอบคุกกี้ในเครื่องมือสำหรับนักพัฒนาแอพลิเคชันภายใต้> ที่เก็บข้อมูล> คุกกี้และดูรายละเอียดเพิ่มเติมได้ที่https://www.chromestatus.com/feature/5088147346030592และhttps://www.chromestatus.com/feature/5633521622188032

ฉันพยายามสร้างคุกกี้แบบนี้ แต่มันก็ช่วยไม่ได้

setcookie($cookie_name,$cookie_value, time() + 3600*24, "/;samesite=None ","mydomain.com", 1);

ปฏิบัติตามคำแนะนำจากนี้คำถาม


มันยังบอกว่า "ปลอดภัย" ซึ่งหมายถึง https ฉันเดา
wOxxOm

คุณสามารถทำตามตัวอย่างนี้เพื่อแก้ปัญหานี้: stackoverflow.com/a/58723552/6215447
Code Cooker

คุณสามารถใช้ห้องสมุดของบุคคลที่สามในการจัดการคุกกี้ใน PHP 5.4+ ให้ทดแทนที่ใช้อาร์กิวเมนต์เพิ่มเติมsetcookie $sameSiteอาร์กิวเมนต์สามารถNone, หรือLax Strictส่วนต่อประสาน OOP ก็มีให้เช่นกัน
caw

คำตอบ:


24

ฉันยังอยู่ใน "การทดลองและข้อผิดพลาด" สำหรับเรื่องนี้ แต่คำตอบนี้จาก Github ของ Google Chrome Labs ช่วยฉันได้เล็กน้อย ฉันกำหนดไว้ในไฟล์หลักและใช้งานได้ดีสำหรับโดเมนบุคคลที่สามเพียงแห่งเดียว ยังคงทำการทดสอบอยู่ แต่ฉันอยากอัปเดตคำตอบนี้ด้วยวิธีแก้ปัญหาที่ดีกว่า :)

หากคุณมี PHP จนถึง 7.2 เซิร์ฟเวอร์ของฉันจะ:

header('Set-Cookie: cross-site-cookie=name; SameSite=None; Secure');

หรือถ้าโฮสต์ของคุณอัปเดตเป็น 7.3 แล้วคุณสามารถใช้:

setcookie('cross-site-cookie', 'name', ['samesite' => 'None', 'secure' => true]);

อีกสิ่งหนึ่งที่คุณสามารถลองตรวจสอบคุกกี้ได้คือเปิดใช้งานการตั้งค่าสถานะด้านล่างซึ่ง - ในคำพูดของตนเอง - "จะเพิ่มข้อความเตือนคอนโซลสำหรับคุกกี้ทุกรายการที่อาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้":

chrome://flags/#cookie-deprecation-messages

ดูรหัสทั้งหมดได้ที่: https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.mdพวกเขาก็มีรหัสsame-site-cookiesด้วยเช่นกัน


ฉันใช้ PHP 7.3 และจับคู่ทั้งสอง (ส่วนหัวและ setcookie) แต่ฉันยังคงได้รับคำเตือน SameSite เมื่อฉันโหลดหน้าเว็บด้วยสคริปต์ PayPal ... ฉันยังอยู่ใน localhost
LuBre

@LuBre อืมอาจเป็นได้ ฉันยังไม่ได้ทดสอบแบบนี้ แต่ก็สมเหตุสมผลแล้ว localhost ของคุณมี SSL หรือไม่
Dimas Pante

1
น่าเศร้าที่ไม่ใช่ปัญหาในพื้นที่ฉันพบว่าคำเตือนออนไลน์นี้เช่นกัน ฉันจะบอกว่ามันเป็นสิ่งที่อยู่ข้าง Paypal ...
LuBre

อืม ... ฉันคิดว่า @vir เราแสดงความคิดเห็นด้านล่างเหมาะกับปัญหาของคุณอาจเป็นไปได้ว่า PayPal ยังไม่กังวลมากนัก: P
Dimas Pante

1
ขอบคุณที่ให้ไวยากรณ์ php 7.3 ใหม่ - ที่แก้ไขปัญหาของฉัน
billynoah

24

เมื่อคุณสมบัติใหม่มาถึงSameSite=Noneคุกกี้ต้องถูกทำเครื่องหมายว่าSecureจะถูกปฏิเสธหรือไม่

สามารถหาข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงในการอัปเดตของโครเมียมและในโพสต์บล็อกนี้

หมายเหตุ : ไม่เกี่ยวข้องโดยตรงกับคำถาม แต่อาจเป็นประโยชน์สำหรับผู้อื่นที่มาที่นี่เนื่องจากเป็นข้อกังวลของฉันในตอนแรกระหว่างการพัฒนาเว็บไซต์ของฉัน:

หากคุณเห็นคำเตือนจากคำถามที่แสดงรายการเว็บไซต์บุคคลที่สาม (ในกรณีของฉันคือ google.com, huh) - นั่นหมายความว่าพวกเขาจำเป็นต้องแก้ไขและไม่เกี่ยวข้องกับเว็บไซต์ของคุณ แน่นอนเว้นแต่คำเตือนจะกล่าวถึงเว็บไซต์ของคุณซึ่งในกรณีนี้การเพิ่มSecureควรแก้ไขได้


6
>= PHP 7.3

setcookie('key', 'value', ['samesite' => 'None', 'secure' => true]);

< PHP 7.3

exploit the path
setcookie('key', 'value', time()+(7*24*3600), "/; SameSite=None; Secure");

Emitting javascript

echo "<script>document.cookie('key=value; SameSite=None; Secure');</script>";

1
เพิ่มข้อมูลคำอธิบายเกี่ยวกับคำตอบของคุณ
Lizesh Shakya

ตกลงเป็นคำตอบเดียวในหน้านี้ที่ใช้งานได้จริงและทำงานในสายการผลิต: D
Robert Greene

1
จากเอกสารนั้นคีย์อาเรย์ควรเป็นตัวพิมพ์เล็ก: ลิงก์
แย่ที่สุด

1
สิ่งนี้ใช้ได้กับฉันใน php 5 และ joomla และ chrome!
Hayden Thring

1

ฉันสิ้นสุดการแก้ไขการติดตั้ง Ubuntu 18.04 / Apache 2.4.29 / PHP 7.2 สำหรับ Chrome 80 โดยการติดตั้ง mod_headers:

a2enmod headers

การเพิ่มคำสั่งต่อไปนี้ให้กับการกำหนดค่า Apache VirtualHost ของเรา:

Header edit Set-Cookie ^(.*)$ "$1; Secure; SameSite=None"

และรีสตาร์ท Apache:

service apache2 restart

ในการตรวจสอบเอกสาร ( http://www.balkangreenfoundation.org/manual/en/mod/mod_headers.html ) ฉันสังเกตเห็นว่าเงื่อนไข "เสมอ" มีสถานการณ์บางอย่างที่ไม่สามารถใช้งานได้จากกลุ่มหัวตอบกลับเดียวกัน ดังนั้นการไม่ใช้ "always" เป็นสิ่งที่ทำงานกับฉันด้วย PHP แต่เอกสารแนะนำว่าถ้าคุณต้องการครอบคลุมฐานทั้งหมดของคุณคุณสามารถเพิ่มคำสั่งทั้งที่มีและไม่มี "เสมอ" ฉันยังไม่ได้ทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.