如何在PHP中设置使用HttpOnly cookie


93

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



2
@Tchalvak不,当前的答案仍然权威。自2008年以来,关于PHP中仅HTTP的cookie设置没有任何改变。哪些浏览器支持仅HTTP cookie,这是一个不同的问题,答案是不同的。
lanzz 2012年

您可以使用$cookie->setHttpOnly(true);github.com/delight-im/PHP-Cookie
CAW

Answers:


92
  • 对于 您的Cookie,请参见此答案。
  • 有关PHP自己的会话CookiePHPSESSID默认为),请参见@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" );

有了PHP 8的命名参数,set_cookie如果不需要设置其他参数,我们最终将使调用变得不再那么冗长。例如set_cookie($name, $value, httponly: true)
Sygmoral

120

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

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

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

ini_set( 'session.cookie_httponly', 1 );

9
+1,因为这对您的整个服务器来说都是一件好事(出于安全性考虑),但是要添加到中php.ini
Anthony Hatzopoulos

10
请注意,应该使用php_flag代替:“不要使用php_value来设置布尔值。应该使用php_flag代替。” php.net/manual/en/configuration.changes.php
Ondrej Machulda

@OndrejMachulda更改php_valuephp_flag无效。我只是在服务器上尝试过
。– Nate

6
@Nate:更改为时php_flag,还必须将值-更改为onoff-参见手册。
Ondrej Machulda

14

请注意,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。

12
php.net/manual/en/function.session-set-cookie-params.php可以通过上述PHP函数自动完成,而无需自定义编码。
Ryaner

13

请注意,HttpOnly不会停止跨站点脚本;它不会阻止跨站点脚本。相反,它抵消了一种可能的攻击,目前仅在IE上进行(FireFox在XmlHttpRequest中公开HttpOnly cookie,而Safari完全不接受)。一定要打开HttpOnly,但是在进行交易时,甚至不要放弃一个小时的输出过滤和模糊测试。


13
自08年以来,这种情况可能已经改变。这是一个较新的/更新列表: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); 

?>

资源




4

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

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

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

  • 更新。

2
仅FYI session.use_only_cookies默认在PHP> 5.3中处于启用状态
Nic Cottrell

1
正确的是“所有将来的会话 cookie”将只使用httponly,而不是自定义的...
qdev

2

php_flag命令的正确语法是

php_flag  session.cookie_httponly On

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.