你如何在 PHP 中设置使用 HttpOnly cookie

Posted

技术标签:

【中文标题】你如何在 PHP 中设置使用 HttpOnly cookie【英文标题】:How do you set up use HttpOnly cookies in PHP 【发布时间】:2010-09-07 09:41:21 【问题描述】:

如何将我的php apps 中的cookie 设置为HttpOnly cookies

【问题讨论】:

***.com/questions/528405/… 有浏览器支持信息。 @Tchalvak 不,目前的答案仍然是权威的。自 2008 年以来,PHP 中的仅 HTTP cookie 设置没有任何变化。 哪些浏览器支持仅 HTTP cookie 是一个不同的问题,有不同的答案。 您可以使用$cookie->setHttpOnly(true); 和github.com/delight-im/PHP-Cookie 【参考方案1】:

对于 PHP 自己在 Apache 上的会话 cookie: 将此添加到您的 Apache 配置或 .htaccess

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

这也可以在脚本中设置,只要在session_start()之前调用即可。

ini_set( 'session.cookie_httponly', 1 );

【讨论】:

+1 因为这是一件好事(出于安全考虑),可以在您的整个服务器上使用,而是添加到 php.ini 请注意应该改用php_flag:“不要使用php_value来设置布尔值。应该改用php_flag。” php.net/manual/en/configuration.changes.php @OndrejMachulda 将php_value 更改为php_flag 不起作用。我刚刚在我的服务器上尝试过.. @Nate:当更改为 php_flag 时,您还必须更改值 - 为 onoff - 请参阅手册。【参考方案2】: 对于您的 cookie,请参阅此答案。 对于PHP自己的会话cookiePHPSESSID,默认),见@richie's answer

setcookie()setrawcookie() 函数在 PHP 5.2.0 的黑暗时代引入了布尔值 httponly 参数,使之变得简单易用。只需按照语法将第 7 个参数设置为 true

为了简洁而简化的函数语法

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

在 PHP NULL。

在 PHP >= 8 中,您可以从使用命名参数中受益。见this question about named params。

setcookie( $name, $value, httponly:true )

也可以使用旧的、较低级别的header() 函数:

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

您可能还需要考虑是否应该设置Secure 参数。

【讨论】:

使用 PHP 8 的命名参数,如果我们不需要设置其他参数,我们最终可以使 set_cookie 调用不那么冗长。例如set_cookie($name, $value, httponly: true). 在 PHP 7.3.0 上,我们可以使用数组。 setcookie("name", "value", ['httponly' =&gt; true]);【参考方案3】:

请注意,PHP 会话 cookie 默认不使用 httponly

这样做:

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

这里有几点注意事项:

您必须致电session_name() 之前session_start() 这也是 将默认路径设置为“/”,即 对于 Opera 是必需的,但是哪个 PHP 会话 cookie 默认不做 要么。

【讨论】:

php.net/manual/en/function.session-set-cookie-params.php 可以通过上述PHP函数自动完成,无需自定义编码。【参考方案4】:

请注意,HttpOnly 不会停止跨站点脚本;相反,它消除了一种可能的攻击,目前仅在 IE 上执行此操作(FireFox 在 XmlHttpRequest 中公开 HttpOnly cookie,而 Safari 根本不支持它)。无论如何,打开 HttpOnly,但不要放弃一个小时的输出过滤和模糊测试来换取它。

【讨论】:

这种情况自 08 年以来可能已经改变。这是一个更新/更新的列表:***.com/questions/528405/…【参考方案5】:
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

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

?>

Source

【讨论】:

【参考方案6】:

可以在设置cookie函数see the php manual中指定

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

【讨论】:

【参考方案7】:

来自 Ilia 的解释... 5.2 仅限

httpOnly cookie flag support in PHP 5.2

如那篇文章所述,您可以在以前版本的 PHP 中自己设置标头

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

【讨论】:

【参考方案8】:

你可以在头文件中使用它。

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

这样以后所有的会话 cookie 都将使用 httponly。

已更新。

【讨论】:

仅供参考 session.use_only_cookies 在 PHP >5.3 中默认开启 正确的是“所有未来的 session cookie”将使用 httponly,而不是自定义的 ...【参考方案9】:

php_flag 命令的正确语法是

php_flag  session.cookie_httponly On

请注意,只需首先从服务器设置 cookie 并在此处回答(例如,您可以看到“HttpOnly”指令。因此,在每次测试请求后测试从浏览器中删除 cookie。

【讨论】:

【参考方案10】:

PHP >=7.0 以来的更优雅的解决方案

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

session_start

session_start options

【讨论】:

【参考方案11】:

解决方案session_start(['cookie_lifetime' =&gt; 43200,'cookie_secure' =&gt; true,'cookie_httponly' =&gt; true]);

谢谢海因。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于你如何在 PHP 中设置使用 HttpOnly cookie的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flask 中设置 HTTPONLY cookie

在 JSESSIONID cookie 中设置 httponly (Java EE 5)

在Python的Flask中设置HTTPONLY Cookie [重复]

在 web.xml 中设置 'HttpOnly' 和 'Secure'

Cookie中设置了"HttpOnly"属性,有效的防止XSS攻击

什么是HttpOnly