NGINX & PHP Cookie 会话中 PHPSESSID 缺少 HTTPOnly、Secure 属性解决方案

1 / 说明
基于安全的考虑,需要给cookie加上Secure和HttpOnly属性,HttpOnly比较好理解,设置HttpOnly=true的cookie不能被js获取到,无法用document.cookie打出cookie的内容。Secure属性是说如果一个cookie被设置了Secure=true,那么这个cookie只能用https协议发送给服务器,用http协议是不发送的。
会话cookie中缺少Secure属性会导致攻击者可以通过非HTTPS页面窃取到用户的cookie信息,造成用户cookie信息的泄露。
cookie中的Secure指的是安全性。通过设定cookie中的Secure,可以指定cookie是否只能通过https协议访问。一般的cookie使用HTTP协议既可访问,如果启用Secure属性,则浏览器仅仅会在HTTPS请求中向服务端发送cookie内容。
在WEB应用中,对于敏感业务,如:登录或者付款,需要使用HTTPS来保证内容的传输安全,而在用户成功获得授权之后,获得的客户端身份cookie如果没有设置为Secure,那么很有可能会被非HTTPS页面拿到,从而造成重要的身份泄露。

2 / PHP解决方案
PHP 5.6以后的版本:
① 简单粗暴直接修改php.ini文件
session.cookie_httponly=true
session.cookie_secure =
② 在php代码中使用ini_set函数设置
ini_set(“session.cookie_httponly”, 1);
(单一入口框架加载index.php 入口文件即可)

③在调用 session_start()之前调用 session_set_cookie_params()函数设置
如果是框架需要修改底层代码,老框架推荐前两个粗暴有效的方法。

<?php private function startSession($time = 3600, $ses = 'MYSES') { session_set_cookie_params($time); session_name($ses); session_start(); if (isset($_COOKIE[$ses])) #第五个参数 设置为true setcookie($ses, $_COOKIE[$ses], time() + $time, "/", true); } ?>

3 / Nginx解决方案
● cookie没有使用http-only;
● cookie没有携带secure属性;
● http头中需要配置“X-Frame-Options:SAMEORIGIN”;
以上这几点可以通过nginx的配置来轻松实现,具体方法就是在需要更改的网页server的配置里面添加下面几句话。
加载Nginx.conf 文件 http{ } 或 server{ }
add_header Set-Cookie “HttpOnly”;
add_header Set-Cookie “Secure”;
## 表示该页面可以在相同域名页面的 frame 中展示
add_header X-Frame-Options SAMEORIGIN;

4 / 实施效果
废话少说,直接项目实例图。

在这里插入图片描述

5 /进一步解读资料
Cookie安全相关属性
HttpOnly :
在Cookie中设置了“HttpOnly”属性,通过程序(JS脚本、Applet等)将无法读取到Cookie信息。
将HttpOnly 设置为true 防止程序获取cookie后进行攻击。
Secure :
安全性,指定Cookie是否只能通过https协议访问,一般的Cookie使用HTTP协议既可访问。
设置了Secure (没有值),则只有当使用https协议连接时cookie才可以被页面访问。可用于防止信息在传递的过程中被监听捕获后信息泄漏。
SameSite:
Chrome浏览器在51版本后为 Cookie 新增的属性,用来防止 CSRF 攻击和用户追踪。可以设置三个值:Strict、 Lax、 None
Strict:完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。Set-Cookie: CookieName=CookieValue; SameSite=Strict;
Lax:规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。Set-Cookie: CookieName=CookieValue; SameSite=Lax;设置了Strict或Lax以后,基本就杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。
None:Chrome 计划将Lax变为默认设置。这时,网站可以选择显式关闭SameSite属性,将其设为None。不过,前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。Set-Cookie: key=value; SameSite=None; Secure


版权声明:本文为backerli原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。