Bagaimana Anda mengatur menggunakan cookie HttpOnly di PHP

93

Bagaimana cara mengatur cookie di PHP appssebagai saya HttpOnly cookies?

Scott Warren
sumber
stackoverflow.com/questions/528405/… Memiliki info dukungan browser.
Kzqai
2
@Tchalvak Tidak, jawaban saat ini masih berwibawa. Tidak ada yang berubah sejak 2008 terkait pengaturan cookie hanya-HTTP di PHP. Browser mana yang mendukung cookie khusus HTTP adalah pertanyaan yang berbeda, dengan jawaban yang berbeda.
lanzz
Anda dapat menggunakan $cookie->setHttpOnly(true);dengan github.com/delight-im/PHP-Cookie
gak

Jawaban:

93
  • Untuk cookie Anda , lihat jawaban ini.
  • Untuk cookie sesi PHP sendiri ( PHPSESSID, secara default), lihat jawaban @ richie

Fungsi setcookie()dan setrawcookie(), memperkenalkan httponlyparameter, kembali ke masa kegelapan PHP 5.2.0, membuat ini bagus dan mudah. Cukup setel parameter ke-7 menjadi true, sesuai sintaksnya

Sintaks fungsi disederhanakan agar singkat

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

Masukkan NULLuntuk parameter yang Anda ingin tetap sebagai default. Anda mungkin juga ingin mempertimbangkan apakah Anda harus mengatur secureparameter.

Bisa juga menggunakan fungsi yang lebih lama, header()fungsi tingkat lebih rendah :

header( "Set-Cookie: name=value; httpOnly" );
Cheekysoft
sumber
1
Dengan parameter bernama PHP 8, akhirnya kita dapat membuat set_cookiepanggilan tidak terlalu bertele-tele jika kita tidak perlu mengatur parameter lainnya. Misalnya set_cookie($name, $value, httponly: true).
Sygmoral
121

Untuk cookie sesi PHP sendiri di Apache:
tambahkan ini ke konfigurasi Apache atau.htaccess

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

Ini juga dapat diatur dalam skrip, asalkan dipanggil sebelumnya session_start().

ini_set( 'session.cookie_httponly', 1 );
richie
sumber
9
+1 karena ini adalah hal yang baik (untuk keamanan) untuk diterapkan di seluruh server Anda, tetapi malah ditambahkan ke php.ini.
Anthony Hatzopoulos
10
Harap dicatat php_flag harus digunakan sebagai gantinya: "Jangan gunakan php_value untuk menyetel nilai boolean. Php_flag harus digunakan sebagai gantinya." php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda Mengubah php_valueke php_flagtidak berhasil. Saya baru saja mencobanya di server saya ..
Nate
6
@Nate: Saat mengubah ke php_flag, Anda juga harus mengubah nilainya - ke salah satu onatau off- lihat manual.
Ondrej Machulda
14

Perhatikan bahwa cookie sesi PHP tidak digunakan httponlysecara default.

Untuk melakukannya:

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

Beberapa item catatan di sini:

  • Anda harus menelepon session_name() sebelumnyasession_start()
  • Ini juga menetapkan jalur default ke '/', yang diperlukan untuk Opera tetapi cookie sesi PHP mana yang tidak dilakukan secara default.

sumber
12
php.net/manual/en/function.session-set-cookie-params.php Ini dapat dilakukan secara otomatis melalui fungsi PHP di atas sebagai pengganti pengkodean khusus.
Ryaner
13

Ketahuilah bahwa HttpOnly tidak menghentikan pembuatan skrip lintas situs; sebaliknya, ia menetralkan satu kemungkinan serangan, dan saat ini melakukannya hanya di IE (FireFox mengekspos cookie HttpOnly di XmlHttpRequest, dan Safari tidak menghormatinya sama sekali). Dengan segala cara, aktifkan HttpOnly, tetapi jangan hentikan bahkan satu jam pemfilteran output dan pengujian fuzz sebagai gantinya.

tqbf
sumber
13
Situasi ini mungkin telah berubah sejak '08, sekarang. Berikut adalah daftar yang lebih baru / diperbarui: 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); 

?>

Sumber

Marius
sumber
5

Penjelasan di sini dari Ilia ... 5.2 saja

httpOnly cookie flag support di PHP 5.2

Seperti yang dinyatakan dalam artikel tersebut, Anda dapat mengatur sendiri header di versi PHP sebelumnya

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

Anda dapat menentukannya dalam fungsi set cookie, lihat manual php

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
Re0sless
sumber
4

Anda dapat menggunakan ini di file header.

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

Dengan cara ini semua cookie sesi mendatang akan menggunakan httponly.

  • Diperbarui.
Marius
sumber
2
FYI saja sesi.use_only_cookies aktif secara default di PHP> 5,3
Nic Cottrell
1
dan yang benar adalah "semua cookie sesi mendatang " akan menggunakan httponly, bukan yang khusus ...
qdev
2

Sintaks yang benar dari perintah php_flag adalah

php_flag  session.cookie_httponly On

Dan berhati-hatilah, hanya jawaban pertama dari server yang mengatur cookie dan di sini (misalnya Anda dapat melihat petunjuk "HttpOnly". Jadi untuk pengujian hapus cookie dari browser setelah setiap permintaan pengujian.

Mareg
sumber
0

Solusi yang lebih elegan sejak PHP> = 7.0

session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

session_start

opsi session_start

Hein
sumber