如何在PHP中设置使用HttpOnly cookie

我如何在我的PHP apps设置Cookie作为HttpOnly cookies

  • 对于你的cookies ,看到这个答案。
  • 对于PHP自己的会话cookie (默认为PHPSESSID ),请参阅@ richie的答案

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 ) 

inputNULL作为默认参数。 你也可以考虑是否应该设置secure参数。

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

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

对于Apache自己的会话cookie:
将其添加到您的Apacheconfiguration或.htaccess

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

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

 ini_set( 'session.cookie_httponly', 1 ); 

请注意,HttpOnly不会停止跨站点脚本; 相反,它中和一个可能的攻击,目前只有在IE浏览器(火狐公开XHTMLHttpRequest HttpOnly cookie,Safari浏览器根本不尊重它)。 无论如何,打开HttpOnly,但不要放弃一个小时的输出过滤和模糊testing交易。

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

要做到这一点:

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

这里有几个注意事项:

  • 你必须在session_name()之前调用session_start()
  • 这也将默认path设置为“/”,这对于Opera来说是必需的,但是默认情况下哪个PHP会话cookie也不会。

在这里解释从髂骨…只有5.2

httpOnly PHP标志支持PHP 5.2

正如那篇文章所述,你可以在PHP的早期版本中自己设置头文件

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

您可以在设置cookiefunction中指定它, 请参阅PHP手册

 setcookie('Foo','Bar',0,'/', 'www.sample.com' , FALSE, TRUE); 
 <?php //None HttpOnly cookie: setcookie("abc", "test", NULL, NULL, NULL, NULL, FALSE); //HttpOnly cookie: setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); ?> 

资源

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

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

这样所有未来的cookies将使用httponly。

php_flag命令的正确语法是

 php_flag session.cookie_httponly On 

而且请注意,首先从服务器回答设置cookie,然后在这里(例如,您可以看到“HttpOnly”指令,因此用于在每次testing请求之后从浏览器中删除Cookie。