PHP中如何为cookie设置HttpOnly?
一、什么是HttpOnly?
httponly是微软对cookie做的扩展,这个主要是解决用户的cookie可能被盗用以及XSS的问题。
Session数据保存在服务器端,但是每一个客户端都需要保存一个SessionID,SessionID保存在Cookies中, 关闭浏览器时过期。在向服务器发送的HTTP请求中会包含SessionID,服务器端根据SessionID获取获取此用户的Session信息。
二、为什么cookie中要设置HttpOnly参数?
1、什么是XSS攻击?
XSS攻击(Cross Site Scripting)中文名为跨站脚本攻击,XSS攻击时web中一种常见的漏洞。通过XSS漏洞可以伪造目标用户登录,从而获取登录后的账号操作。
2、网站账号登录过程中的简单步骤
web网页中在用户登录的时候,通过表单把用户输入的账号密码进行后台数据库的验证,验证通过后利用session会话进行用户登录后的判别是否登录,在session的这个过程中服务器会在服务器中写入一个文件并记录sessionid,然后也会在浏览器中设置cookie,保存sessionid,服务器和客户端之间利用这个sessionid进行通信识别。如果客户端发送sessionid给服务器服务器没有找到,则说明服务器中的这个文件已经过期删除了。那用户这边就需要重新登录了。
3、XSS攻击的流程
思路:通过获取目标用户登录后的sessionid,保存到自己的电脑,然后在自己的电脑上设置获取到的sessionid进行账号登录后的操作。通过sessionid伪造请求登录,直接跳过账号密码登录操作就能进去。
例如:
给目标用户发送一个有吸引力的邮件,邮箱中包含一个链接,当用户点击链接跳转到一个伪造的页面,这个伪造的页面中包含了获取目标用户浏览器中cookie的javascript代码,获取到cookie中的sessionid后再传送到攻击者的服务器中;或者在站点中的可插入数据的地方进行在html中写行内的javascript代码执行操作,如下:
< IMG SRC="javascript:alert('XSS');" >;
还可以当在一个公共wifi环境下,进行可账号登录操作,wifi路由器的管理员可以通过抓包工具抓包直接抓包查看到你的sessionid,所以不要在公共wifi下进行敏感操作,是很不安全的。
三、PHP中cookie设置HttpOnly三种方法
在PHP编程中,cookie设置HttpOnly其实是非常的简单的,具体操作如下:
第一种方法:在 php.ini 配置文件中进行cookie只读设置的开启
设置其值为1或者TRUE;
session.cookie_httponly = On
以上意思是:将Cookie标记为只能通过HTTP协议访问。 这意味着无法通过脚本语言(例如JavaScript)访问cookie。 此设置可以有效地帮助通过XSS攻击减少身份盗用(尽管并非所有浏览器都支持此功能)。
具体可参考:
https://www.php.net/manual/zh/session.configuration.php#ini.session.cookie-httponly
第二种方法:在php代码顶部设置
ini_set("session.cookie_httponly", 1);
#(php5.1以前版本设置方法:header("Set-Cookie: hidden=value; httpOnly");)
第三种方法:在PHP代码中用setcookie或setrawcookie
Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
setcookie("name", "fujieace", NULL, NULL, NULL, NULL, TRUE);
setrawcookie("name", "fujieace", NULL, NULL, NULL, NULL, TRUE);
总结:
我的建议是大家既要在php.ini配置文件里面设置 session.cookie_httponly=1或ture,还有就是大家在用setcookie或setrawcookie函数的时候,也要在第七个参数设置为ture,这样的话,你的cookie中无论是PHPSESSID还是你自己定义的httponly都会是true。