Làm cách nào để bạn thiết lập sử dụng cookie HttpOnly trong PHP


93

Làm cách nào tôi có thể đặt cookie trong của tôi PHP appsHttpOnly cookies?


stackoverflow.com/questions/528405/… Có thông tin hỗ trợ trình duyệt.
Kzqai

2
@Tchalvak Không, câu trả lời hiện tại vẫn có thẩm quyền. Không có gì thay đổi kể từ năm 2008 về cài đặt cookie chỉ HTTP trong PHP. Những trình duyệt nào hỗ trợ cookie chỉ HTTP là một câu hỏi khác, với một câu trả lời khác.
lanzz

Bạn có thể sử dụng $cookie->setHttpOnly(true);với github.com/delight-im/PHP-Cookie
caw

Câu trả lời:


92
  • Đối với cookie của bạn , hãy xem câu trả lời này.
  • Đối với cookie phiên riêng của PHP ( PHPSESSIDtheo mặc định), hãy xem câu trả lời của @ richie

Các setcookie()setrawcookie()chức năng, đã giới thiệu httponlytham số, trở lại thời kỳ đen tối của PHP 5.2.0, làm cho việc này trở nên dễ dàng và đẹp mắt. Chỉ cần đặt tham số thứ 7 thành true, theo cú pháp

Cú pháp hàm được đơn giản hóa để ngắn gọn

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

Nhập NULLcác thông số bạn muốn giữ nguyên như mặc định. Bạn cũng có thể muốn xem xét xem bạn có nên thiết lập securetham số hay không.

Cũng có thể sử dụng header()hàm cấp thấp hơn, cũ hơn :

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

Với các tham số được đặt tên của PHP 8, cuối cùng chúng ta sẽ có thể thực hiện set_cookiecuộc gọi ít dài dòng hơn nếu chúng ta không cần đặt các tham số khác. Ví dụ set_cookie($name, $value, httponly: true).
Sygmoral

120

Đối với cookie phiên riêng của PHP trên Apache:
thêm cái này vào cấu hình Apache của bạn hoặc.htaccess

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

Điều này cũng có thể được đặt trong một tập lệnh, miễn là nó được gọi trước đó session_start().

ini_set( 'session.cookie_httponly', 1 );

9
+1 vì đây là một điều tốt (để bảo mật) có trên toàn bộ máy chủ của bạn nhưng thay vào đó được thêm vào php.ini.
Anthony Hatzopoulos

10
Xin lưu ý rằng php_flag nên được sử dụng thay thế: "Không sử dụng php_value để đặt các giá trị boolean. Thay vào đó, nên sử dụng php_flag." php.net/manual/en/configuration.changes.php
Ondrej Machulda

@OndrejMachulda Thay đổi php_valuethành php_flagkhông hoạt động. Tôi vừa thử nó trên máy chủ của mình ..
Nate

6
@Nate: Khi thay đổi thành php_flag, bạn cũng phải thay đổi giá trị - thành một trong hai onhoặc off- xem hướng dẫn.
Ondrej Machulda

14

Lưu ý rằng cookie phiên PHP không sử dụng httponlytheo mặc định.

Để làm việc đó:

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

Một số mục cần lưu ý ở đây:

  • Bạn phải gọi session_name() trướcsession_start()
  • Điều này cũng đặt đường dẫn mặc định thành '/', điều này cần thiết cho Opera nhưng cookie phiên PHP nào cũng không làm theo mặc định.

12
php.net/manual/en/ Chức năng.session-set-cookie-params.php Nó có thể được thực hiện tự động thông qua hàm PHP ở trên thay vì viết mã tùy chỉnh.
Ryaner

13

Hãy lưu ý rằng HttpOnly không ngừng tạo tập lệnh trên nhiều trang web; thay vào đó, nó vô hiệu hóa một cuộc tấn công có thể xảy ra và hiện chỉ thực hiện điều đó trên IE (FireFox để lộ cookie HttpOnly trong XmlHttpRequest và Safari hoàn toàn không thực hiện điều đó). Bằng mọi cách, hãy bật HttpOnly, nhưng đừng bỏ qua dù chỉ một giờ lọc đầu ra và thử nghiệm lông tơ để đổi lấy nó.


13
Tình hình này có thể đã thay đổi kể từ năm '08, bây giờ. Đây là danh sách cập nhật / mới hơn: stackoverflow.com/questions/528405/…
Kzqai,

7
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

//HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); 

?>

Nguồn




4

Bạn có thể sử dụng điều này trong tệp tiêu đề.

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

Bằng cách này, tất cả cookie phiên trong tương lai sẽ chỉ sử dụng http.

  • Đã cập nhật.

2
Chỉ cần FYI session.use_only_cookies là theo mặc định trong PHP> 5.3
Nic Cottrell

1
và đúng là "tất cả trong tương lai phiên cookies" sẽ sử dụng HttpOnly, những người không tùy chỉnh ...
qdev

2

Cú pháp đúng của lệnh php_flag là

php_flag  session.cookie_httponly On

Và hãy lưu ý, chỉ cần câu trả lời đầu tiên từ máy chủ đặt cookie và tại đây (ví dụ: Bạn có thể xem chỉ thị "HttpOnly". Vì vậy, để thử nghiệm, hãy xóa cookie khỏi trình duyệt sau mỗi yêu cầu thử nghiệm.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.