我怎样才能在我的 PHP apps 作为 HttpOnly cookies?

有帮助吗?

解决方案

  • 为了 你的饼干, ,请参阅此答案。
  • 为了 PHP自己的会话cookie (PHPSESSID, ,默认情况下),请参阅 @richie的回答

setcookie()setrawcookie() 功能,介绍了 httponly 参数,早在 PHP 5.2.0 的黑暗时代,就让这一切变得美好而简单。只需按照语法将第 7 个参数设置为 true

为简洁起见简化了函数语法

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

进入 NULL 对于您希望保留默认值的参数。您可能还需要考虑是否应该设置 secure 范围。

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

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

其他提示

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

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

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

ini_set( 'session.cookie_httponly', 1 );

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

请注意,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 Session Cookie也不会这样做。
<?php
//None HttpOnly cookie:
setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); 

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

?>

来源

伊利亚的解释...虽然只有5.2

PHP 5.2 中的 httpOnly cookie 标志支持

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

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

可以在设置cookie函数中指定 请参阅 PHP 手册

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

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

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

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

  • 更新。

php_flag 命令的正确语法是

php_flag  session.cookie_httponly On

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top