Wie richte ich die Verwendung von HttpOnly-Cookies in PHP ein?

92

Wie kann ich die Cookies in meinem PHP appsas setzen HttpOnly cookies?

Scott Warren
quelle
stackoverflow.com/questions/528405/… Hat Informationen zur Browserunterstützung.
Kzqai
2
@Tchalvak Nein, die aktuellen Antworten sind noch maßgebend. Seit 2008 hat sich nichts an der Einstellung von HTTP-Cookies in PHP geändert. Welche Browser nur HTTP-Cookies unterstützen, ist eine andere Frage mit einer anderen Antwort.
Lanzz
Sie können $cookie->setHttpOnly(true);mit github.com/delight-im/PHP-Cookie
caw

Antworten:

92

Die setcookie()und setrawcookie()-Funktionen führten den httponlyParameter in den dunklen Zeiten von PHP 5.2.0 ein und machten dies schön und einfach. Setzen Sie einfach den 7. Parameter gemäß der Syntax auf true

Funktionssyntax der Kürze halber vereinfacht

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

Geben NULLSie die Parameter ein, die Sie als Standard beibehalten möchten. Möglicherweise möchten Sie auch überlegen, ob Sie den secureParameter einstellen sollten .

Es ist auch möglich, die ältere header()Funktion auf niedrigerer Ebene zu verwenden:

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

Für PHP-eigene Sitzungscookies auf Apache:
Fügen Sie dies Ihrer Apache-Konfiguration hinzu oder.htaccess

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

Dies kann auch innerhalb eines Skripts festgelegt werden, sofern es zuvor aufgerufen wurde session_start().

ini_set( 'session.cookie_httponly', 1 );
Richie
quelle
9
+1, da dies eine gute Sache (aus Sicherheitsgründen) ist, die auf Ihrem gesamten Server vorhanden ist, aber stattdessen zum hinzugefügt wird php.ini.
Anthony Hatzopoulos
10
Bitte beachten Sie, dass stattdessen php_flag verwendet werden sollte: "Verwenden Sie php_value nicht zum Festlegen von Booleschen Werten. Stattdessen sollte php_flag verwendet werden." php.net/manual/en/configuration.changes.php
Ondrej Machulda
@OndrejMachulda Das Wechseln php_valuezu php_flagfunktioniert funktioniert nicht. Ich habe es gerade auf meinem Server versucht ..
Nate
6
@Nate: Wenn Sie zu ändern php_flag, müssen Sie auch den Wert ändern - entweder onoder off- siehe Handbuch.
Ondrej Machulda
14

Beachten Sie, dass PHP-Sitzungscookies httponlystandardmäßig nicht verwendet werden.

Das zu tun:

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

Einige wichtige Punkte hier:

  • Sie müssen session_name() vorher anrufensession_start()
  • Dadurch wird auch der Standardpfad auf '/' gesetzt, was für Opera erforderlich ist, PHP-Sitzungscookies jedoch standardmäßig auch nicht.

quelle
11
php.net/manual/en/function.session-set-cookie-params.php Dies kann automatisch über die oben genannte PHP-Funktion anstelle der benutzerdefinierten Codierung erfolgen.
Ryaner
13

Beachten Sie, dass HttpOnly das Cross-Site-Scripting nicht beendet. Stattdessen wird ein möglicher Angriff neutralisiert, und dies geschieht derzeit nur im Internet Explorer (FireFox macht HttpOnly-Cookies in XmlHttpRequest verfügbar, und Safari berücksichtigt dies überhaupt nicht). Schalten Sie auf jeden Fall HttpOnly ein, aber lassen Sie nicht einmal eine Stunde Ausgabefilterung und Fuzz-Tests im Handel dafür fallen.

tqbf
quelle
13
Diese Situation hat sich möglicherweise seit '08 geändert. Hier ist eine aktuellere / aktualisierte Liste: 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); 

?>

Quelle

Marius
quelle
5

Erklärung hier von Ilia ... nur 5.2

Unterstützung nur für Cookie-Flags in PHP 5.2

Wie in diesem Artikel angegeben, können Sie den Header in früheren Versionen von PHP selbst festlegen

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

Sie können es in der eingestellten Cookie-Funktion angeben, siehe PHP-Handbuch

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

Sie können dies in einer Header-Datei verwenden.

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

Auf diese Weise verwenden alle zukünftigen Sitzungscookies nur http.

  • Aktualisiert.
Marius
quelle
2
Nur FYI session.use_only_cookies ist standardmäßig in PHP> 5.3
Nic Cottrell
1
und richtig ist, dass "alle zukünftigen Sitzungscookies " nur http, nur benutzerdefinierte verwenden ...
qdev
2

Die richtige Syntax des Befehls php_flag lautet

php_flag  session.cookie_httponly On

Und seien Sie sich bewusst, setzen Sie einfach zuerst die Antwort vom Server und setzen Sie das Cookie und hier (zum Beispiel können Sie die Anweisung "HttpOnly" sehen. Zum Testen löschen Sie Cookies nach jeder Testanforderung aus dem Browser.

Mareg
quelle
0

Eine elegantere Lösung seit PHP> = 7.0

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

session_start

session_start-Optionen

Hein
quelle