คุณจะตั้งค่าใช้คุกกี้ HttpOnly ใน PHP ได้อย่างไร


93

ฉันจะตั้งค่าคุกกี้PHP appsเป็นของฉันได้HttpOnly cookiesอย่างไร?


stackoverflow.com/questions/528405/…มีข้อมูลการสนับสนุนเบราว์เซอร์
Kzqai

2
@Tchalvak ไม่คำตอบปัจจุบันยังคงเชื่อถือได้ ไม่มีอะไรเปลี่ยนแปลงตั้งแต่ปี 2008 เกี่ยวกับการตั้งค่าคุกกี้ HTTP เท่านั้นใน PHP เบราว์เซอร์ใดที่รองรับคุกกี้ HTTP เท่านั้นเป็นคำถามที่แตกต่างกันโดยมีคำตอบที่ต่างออกไป
lanzz

คุณสามารถใช้$cookie->setHttpOnly(true);กับgithub.com/delight-im/PHP-Cookie
caw

คำตอบ:


93
  • สำหรับคุกกี้ของคุณโปรดดูคำตอบนี้
  • สำหรับคุกกี้เซสชันของ PHP เอง ( PHPSESSIDโดยค่าเริ่มต้น) โปรดดูคำตอบของ @ richie

setcookie()และsetrawcookie()ฟังก์ชั่นแนะนำhttponlyพารามิเตอร์กลับมาอยู่ในยุคมืดของ PHP 5.2.0 ทำให้นี้ดีและใช้งานง่าย เพียงตั้งค่าพารามิเตอร์ที่ 7 เป็นจริงตามไวยากรณ์

ไวยากรณ์ของฟังก์ชันง่ายขึ้นสำหรับความกะทัดรัด

setcookie(    $name, $value, $expire, $path, $domain, $secure, $httponly )
setrawcookie( $name, $value, $expire, $path, $domain, $secure, $httponly )

ป้อนNULLพารามิเตอร์ที่คุณต้องการให้เป็นค่าเริ่มต้น คุณอาจต้องพิจารณาด้วยว่าคุณควรตั้งค่าsecureพารามิเตอร์หรือไม่

นอกจากนี้ยังสามารถใช้header()ฟังก์ชันระดับล่างที่เก่ากว่า:

header( "Set-Cookie: name=value; httpOnly" );

1
ด้วยพารามิเตอร์ที่ตั้งชื่อของ PHP 8 ในที่สุดเราจะสามารถทำการset_cookieโทรให้ละเอียดน้อยลงหากเราไม่จำเป็นต้องตั้งค่าพารามิเตอร์อื่น ๆ ตัวอย่างเช่นset_cookie($name, $value, httponly: true).
Sygmoral

121

สำหรับคุกกี้เซสชันของ PHP บน Apache:
เพิ่มสิ่งนี้ในการกำหนดค่า Apache ของคุณหรือ.htaccess

<IfModule php5_module>
    php_flag session.cookie_httponly on
</IfModule>

นอกจากนี้ยังสามารถตั้งค่าภายในสคริปต์ได้ตราบเท่าที่มีการเรียกใช้ก่อนหน้าsession_start()นี้

ini_set( 'session.cookie_httponly', 1 );

9
+1 เนื่องจากนี่เป็นสิ่งที่ดี (เพื่อความปลอดภัย) ที่จะมีในเซิร์ฟเวอร์ทั้งหมดของคุณ แต่จะเพิ่มลงในไฟล์php.ini.
Anthony Hatzopoulos

10
โปรดทราบว่าควรใช้ php_flag แทน: "อย่าใช้ php_value เพื่อตั้งค่าบูลีนควรใช้ php_flag แทน" php.net/manual/en/configuration.changes.php
Ondrej Machulda

@OndrejMachulda การเปลี่ยนphp_valueเป็นใช้php_flagไม่ได้ เพิ่งลองใช้งานบนเซิร์ฟเวอร์ ..
เนท

6
@Nate: เมื่อเปลี่ยนเป็นphp_flagคุณต้องเปลี่ยนค่าด้วย - เป็นอย่างใดอย่างหนึ่งonหรือoff- ดูคู่มือ
Ondrej Machulda

14

โปรดทราบว่าคุกกี้เซสชัน PHP ไม่ได้ใช้httponlyโดยค่าเริ่มต้น

ในการทำเช่นนั้น:

$sess_name = session_name();
if (session_start()) {
    setcookie($sess_name, session_id(), null, '/', null, null, true);
}

หมายเหตุสองสามข้อที่นี่:

  • คุณต้องโทรsession_name() มาก่อนsession_start()
  • นอกจากนี้ยังตั้งค่าเส้นทางเริ่มต้นเป็น '/' ซึ่งจำเป็นสำหรับ Opera แต่คุกกี้เซสชัน PHP ใดไม่ทำตามค่าเริ่มต้น

12
php.net/manual/en/function.session-set-cookie-params.phpสามารถทำได้โดยอัตโนมัติผ่านฟังก์ชัน PHP ด้านบนแทนการเข้ารหัสแบบกำหนดเอง
Ryaner

13

โปรดทราบว่า HttpOnly ไม่ได้หยุดการเขียนสคริปต์ข้ามไซต์ แต่จะทำให้การโจมตีที่เป็นไปได้นั้นเป็นกลางแทนและในปัจจุบันทำได้เฉพาะบน IE (FireFox เปิดเผยคุกกี้ HttpOnly ใน XmlHttpRequest และ Safari ไม่ให้เกียรติเลย) โดยทั้งหมดให้เปิด HttpOnly แต่อย่าทิ้งการกรองเอาต์พุตและทดสอบฟัซซ์แม้แต่ชั่วโมงเดียวในการแลกเปลี่ยน


13
สถานการณ์นี้อาจเปลี่ยนไปตั้งแต่ปี '08 ตอนนี้ นี่คือรายการปัจจุบัน / ปรับปรุงเพิ่มเติม: stackoverflow.com/questions/528405/…
Kzqai


5

คำอธิบายที่นี่จาก Ilia ... 5.2 เท่านั้น

http สนับสนุนเฉพาะคุกกี้แฟล็กใน PHP 5.2

ตามที่ระบุไว้ในบทความนั้นคุณสามารถตั้งค่าส่วนหัวด้วยตัวคุณเองใน PHP เวอร์ชันก่อนหน้า

header("Set-Cookie: hidden=value; httpOnly");


4

คุณสามารถใช้สิ่งนี้ในไฟล์ส่วนหัว

// setup session enviroment
ini_set('session.cookie_httponly',1);
ini_set('session.use_only_cookies',1);

วิธีนี้คุกกี้เซสชันในอนาคตทั้งหมดจะใช้ httponly

  • อัปเดตแล้ว

2
Just FYI session.use_only_cookies เปิดอยู่โดยค่าเริ่มต้นใน PHP> 5.3
Nic Cottrell

1
และที่ถูกต้องคือ " คุกกี้เซสชันในอนาคตทั้งหมด" จะใช้ http เท่านั้นไม่ใช่คุกกี้ที่กำหนดเอง ...
qdev

2

ไวยากรณ์ที่ถูกต้องของคำสั่ง php_flag คือ

php_flag  session.cookie_httponly On

และโปรดทราบเพียงคำตอบแรกจากเซิร์ฟเวอร์ตั้งค่าคุกกี้และที่นี่ (ตัวอย่างเช่นคุณสามารถดูคำสั่ง "HttpOnly" ดังนั้นสำหรับการทดสอบการลบคุกกี้ออกจากเบราว์เซอร์หลังจากการร้องขอการทดสอบทุกครั้ง


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