99

如何在我的PHP appsas中设置 cookie HttpOnly cookies

4

11 回答 11

127

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

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

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

ini_set( 'session.cookie_httponly', 1 );
于 2012-01-04T11:41:46.030 回答
99
  • 对于您的 cookie,请参阅此答案。
  • 对于PHP 自己的会话 cookiePHPSESSID默认情况下),请参阅@richie 的答案

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

为简洁而简化的函数语法

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

在 PHP < 8 中,指定NULL您希望保留为默认值的参数。

在 PHP >= 8 中,您可以从使用命名参数中受益。请参阅有关命名参数的这个问题

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

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

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

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

于 2008-08-31T14:38:41.730 回答
15

httponly请注意,默认情况下不使用 PHP 会话 cookie 。

要做到这一点:

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

这里有几点需要注意:

  • 你必须先session_name() 打电话session_start()
  • 这还将默认路径设置为“/”,这对于 Opera 是必需的,但默认情况下 PHP 会话 cookie 也不会这样做。
于 2008-10-30T14:57:19.637 回答
13

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

于 2008-09-10T21:40:41.723 回答
9
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

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

?>

来源

于 2008-08-31T14:36:36.993 回答
6

您可以在 set cookie 函数中指定它,请参阅 php 手册

setcookie('Foo','Bar',0,'/', 'www.sample.com'  , FALSE, TRUE);
于 2008-08-31T14:37:06.087 回答
5

来自 Ilia 的解释......虽然只有 5.2

PHP 5.2 中的 httpOnly cookie 标志支持

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

header("Set-Cookie: hidden=value; httpOnly");
于 2008-08-31T14:35:02.177 回答
4

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

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

这样,所有未来的会话 cookie 都将使用 httponly。

  • 更新。
于 2013-05-27T22:24:17.763 回答
2

php_flag 命令的正确语法是

php_flag  session.cookie_httponly On

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

于 2013-11-19T20:51:10.180 回答
0

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

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

session_start

session_start 选项

于 2020-04-23T15:38:02.770 回答
0

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

谢谢海因。

于 2021-10-05T19:56:50.877 回答