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

时间:2008-08-31 14:27:50

标签: php security cookies xss httponly

如何将PHP apps中的Cookie设置为HttpOnly cookies

10 个答案:

答案 0 :(得分:106)

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

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

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

ini_set( 'session.cookie_httponly', 1 );

答案 1 :(得分:83)

  • 对于您的Cookie ,请参阅此答案。
  • 对于 PHP自己的会话Cookie (默认情况下为PHPSESSID),请参阅@richie's answer

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" );

答案 2 :(得分:13)

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

答案 3 :(得分:12)

请注意,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默认不会这样做 无论是。

答案 4 :(得分:5)

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

httpOnly cookie flag support in PHP 5.2

如该文章所述,您可以在以前的PHP版本中自行设置标题

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

答案 5 :(得分: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 :(得分:5)

您可以在设置Cookie函数see the php manual

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

答案 7 :(得分:3)

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

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

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

  • 更新

答案 8 :(得分:1)

php_flag命令的正确语法是

php_flag  session.cookie_httponly On

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

答案 9 :(得分:0)

PHP> = 7.0

以来的更优雅的解决方案
session_start(['cookie_lifetime' => 43200,'cookie_secure' => true,'cookie_httponly' => true]);

session_start

session_start options