Session Cookie的HttpOnly和secure属性

news/2024/5/18 14:29:38 标签: Session, Cookie, HttpOnly, secure

一、属性说明:


1 secure属性
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。
2 HttpOnly属性
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。

对于以上两个属性,
首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,HttpOnly属性的目的是防止程序获取cookie后进行攻击。
其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session CookieHttpOnly属性。
也就是说两个属性,并不能解决cookie在本机出现的信息泄漏的问题(FireFox的插件FireBug能直接看到cookie的相关信息)。

What is it and why do I care ?

Session cookies (或者包含JSSESSIONID的cookie)是指用来管理web应用的session会话的cookies.这些cookie中保存特定使用者的session ID标识,而且相同的session ID以及session生命周期内相关的数据也在服务器端保存。在web应用中最常用的session管理方式是通过每次请求的时候将cookies传送到服务器端来进行session识别。

你可以设置附加的secure标识来提示浏览器只能通过Https(加密方式)方式来传输cookie,Http(未加密方式)方式则不可以。这种方式来保证你的session cookie对于攻击者是不可见的,避免中间人攻击(Man-in-the-Middle Attack,简称“MITM攻击”)。这并不是一个完美的session安全管理方案,却是一个重要的步骤。

what should I do about it ?

应对方法很简单。你必须在session cookie添加secure标识(如果有可能的话最好保证请求中的所有cookies都是通过Https方式传输)

如下是示例:未添加secure标识的session cookie-可能会被泄露

Cookie: jsessionid=AS348AF929FK219CKA9FK3B79870H;

添加secure标识:

Cookie: jsessionid=AS348AF929FK219CKA9FK3B79870H; secure;

方式很简洁。你可以甚至可以手工设置这个标识,如果你在Servlet3或者更新的环境中开发,只需要在web.xml简单的配置来实现。你只要在web.xml中添加如下片段:

  <!-- Cookie设置secure属性,提示浏览器只能通过Https(加密方式)方式来传输cookie,
  Http(未加密方式)方式则不可以 -->
  <session-config>
    <cookie-config>
      <http-only>true</http-only>
      <secure>true</secure>
    </cookie-config>
  </session-config>

 


Filter:

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * @Description: Cookie设置HttpOnly,Secure,Expire属性
 * @Author Tongshan.Han@partner.bmw.com
 * @Date 2018/10/24 21:57
 */

public class CookieFilter implements Filter {

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        Cookie[] cookies = req.getCookies();

        if (cookies != null) {
            Cookie cookie = cookies[0];
            if (cookie != null) {
                    /*cookie.setMaxAge(3600);
                    cookie.setSecure(true);
                    resp.addCookie(cookie);*/

                //Servlet 2.5不支持在Cookie上直接设置HttpOnly属性
                String value = cookie.getValue();
                StringBuilder builder = new StringBuilder();
                builder.append("JSESSIONID=" + value + "; ");
                builder.append("Secure; ");
                builder.append("HttpOnly; ");
                builder.append("Path=/; ");
                Calendar cal = Calendar.getInstance();
                cal.add(Calendar.HOUR, 1);
                Date date = cal.getTime();
                Locale locale = Locale.CHINA;
                SimpleDateFormat sdf =
                        new SimpleDateFormat("dd-MM-yyyy HH:mm:ss",locale);
                builder.append("Expires=" + sdf.format(date));
                resp.setHeader("Set-Cookie", builder.toString());
            }
        }
        chain.doFilter(req, resp);
    }

    public void destroy() {
    }

    public void init(FilterConfig arg0) throws ServletException {
    }

}```

 


http://www.niftyadmin.cn/n/1555437.html

相关文章

java创建一个可执行的jar包小程序

首先有两个概念需要清楚&#xff1a; 1、idea打包java可执行jar包&#xff1a;http://www.cnblogs.com/blog5277/p/5920560.html 2、Java中String [] args中的args是什么意思&#xff1a;https://blog.csdn.net/qq_35603268/article/details/79206028 以上两个请参考博客链接内…

cnc加工中心保养表_忠艺隆|CNC加工中心的保养方法

cnc加工中心的应用范围非常广泛&#xff0c;也是目前精密机械加工领域中经常使用到的一种设备&#xff0c;在使用加工中心的时,不管是使用之前还是过程还是使用完毕,对应的保养事项都是不能忽视的&#xff0c;今天忠艺隆小编就为大家分享一下关于cnc加工中心的保养知识。1、在加…

如何从文本中截取自己想有得数据并去重,统计,排序

关键的指令为&#xff1a; awk为分割截取&#xff0c;sort为排序&#xff0c;uniq为去重&#xff0c;wc为统计&#xff0c;你需要单独去理解这些指令&#xff0c;然后通过管道进行数据传送 特别注意&#xff1a; 用uniq命令可以删除相邻的重复行&#xff1a; uniq [file] 但如…

python爬虫免费课程400节_DC免费课程(一)|啥?手把手教小白python爬虫!

话不多说&#xff0c;今天为你奉送两节入门干货教程~啦啦啦开课啦&#xff0c;看黑板&#xff0c;都看黑板~1. 安装Anaconda在我们的教学中&#xff0c;我们使用的版本是Python3&#xff0c;至于为什么要选Python3&#xff0c;哼哼&#xff01;工欲善其事&#xff0c;必先利其器…

volatile和synchronized的区别与联系

这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符&#xff0c;而synchronized是一个方法或块的修饰符。所以我们使用这两种关键字来指定三种简单的存取变量的方式。 int i1; int geti1() { return i1; } volati…

rimworld简单机器人mod_机器人轨迹生成的几种方法

点击上方蓝色字体加关注阅读更多内容点击专辑可以查看相关文章最近&#xff0c;有一个好友问我&#xff0c;能不能在ABB机器人上实现写字&#xff0c;画画&#xff0c;雕刻等功能&#xff0c;实际上当然是可以的&#xff0c;其实放在任何机器人上都可以实现&#xff0c;只是实现…

Spring Boot Vue Element入门实战 一、VUE开发环境搭建

本博客属作者原创,未经允许禁止转载,请尊重原创!如有问题请联系QQ509961766 (一)Java环境 请参考Java环境变量配置 (二)Node.js环境 官网下载Node,下载完成后安装 环境变量配置变量名:NODE_HOME 变量值:node.js安装目录

Spring Boot Vue Element入门实战 二、前端框架搭建

本博客属作者原创,未经允许禁止转载,请尊重原创!如有问题请联系QQ509961766 (一)IDEA开发工具 这里其实推荐Atom或者webstorm,Atom有很多vue的插件,高亮语法检查小地图等等一些很实用的插件。本次实战环境选择IDEA编辑器,导入入门实战(一)中的生成的工程如下图 . VUE…