栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

Cookie设置HttpOnly属性

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Cookie设置HttpOnly属性

在Servlet 3.0中增加对cookie(请注意,这里所说的cookie,仅指和Session互动的cookie,即人们常说的会话cookie)较为全面的操作API。最为突出特性:支持直接修改Session ID的名称(默认为“JSESSIONID”),支持对cookie设置HttpOnly属性以增强安全,避免一定程度的跨站攻击。防止脚本攻击,禁止了通过脚本获取cookie信息,浏览器不会将其发送给任何第三方

利用拦截器实现,判断每次请求的响应是否包含SET-cookie头部,重写会话cookie,添加需要的属性。虽较为生硬,但灵活性强。
新的规范API
新的规范添加SessioncookieConfig接口,用于操作会话cookie,需要掌握以下主要方法:

setName(String name)
修改Session ID的名称,默认为"JSESSIONID"setDomain(String domain)
设置当前cookie所处于的域
setPath(String path)
设置当前cookie所处于的相对路径
setHttponly(boolean httpOnly)
设置是否支持HttpOnly属性
setSecure(boolean secure)
若使用HTTPS安全连接,则需要设置其属性为truesetMaxAge(int maxAge)设置存活时间,单位为秒

如何使用呢,很方便,在ServletContextListener监听器初始化方法中进行设定即可;下面实例演示如何修改"JSESSIONID",以及添加支持HttpOnly支持:

全局设置Session-cookie相交互部分属性@WebListenerpublic class SessioncookieInitialization implements ServletContextListener {private static final Log log = LogFactory
   .getLog(SessioncookieInitialization.class);public void contextInitialized(ServletContextEvent sce) {
  log.info("now init the Session cookie");

  ServletContext servletContext = sce.getServletContext();

  SessioncookieConfig sessioncookie = servletContext
    .getSessioncookieConfig();
  sessioncookie.setName("YONGBOYID");
  sessioncookie.setPath(servletContext.getContextPath());
  sessioncookie.setHttponly(true);
  sessioncookie.setSecure(false);

  log.info("name : " + sessioncookie.getName() + "n" + "domain:"
    + sessioncookie.getDomain() + "npath:"
    + sessioncookie.getPath() + "nage:"
    + sessioncookie.getMaxAge());

  log.info("isHttpOnly : " + sessioncookie.isHttponly());
  log.info("isSecure : " + sessioncookie.isSecure());
}public void contextDestroyed(ServletContextEvent sce) {
  log.info("the context is destroyed !");
}
}

需要通过ServletContext对象获得SessioncookieConfig对象,才能够进一步自定义session cookie的属性。
无论以前的硬编码还是新的API实现,目标都是一致的,所产生头部信息也是完全一致。
毫无疑问,后者更为方便快捷,省缺了显示的操作响应元数据。
对当前站点的第一次请求,很容易从响应头信息中看到Set-cookie的属性值:

不同浏览器平台上测试
在Safari、IE8、Opera 11 一切都很正常
Firefox 3.6、Chrome 9.0,JSESSIONID会继续存在:

    YonGBOYID=601A6C82D535343163B175A4FD5376EA; JSESSIonID=AA78738AB1EAD1F9C649F705EC64D92D; AJSTAT_ok_times=6; JSESSIonID=abcpxyJmIpBVz6WHVo_1s; BAYEUX_BROWSER=439-1vyje1gmqt8y8giva7pqsu1

在所有浏览器中,SESSION ID等于新设置的YONGBOYID值(若不相等,问题就严重了!)
在客户端JS无法获得正确的SESSIONI ID了。

Tomcat服务器内置支持
可以不用如上显示设置cookie domain、name、HttpOnly支持,在conf/context.xml文件中配置即可:

...

既然JAVA应用服务器本身支持会话cookie设定,那就没有必要在程序代码中再次进行编码了。这是一个好的实践:不要重复造轮子。
这里给出一段测试Session重写的一段脚本:

正常连接">重定向连接

会被重写的URL地址类似于:

http://localhost/servlet3/sessioncookieTest;YonGBOYID=19B94935D50245270060E49C9E69F5B6

嗯,在取消会话cookie之后,可以直接看到修改后的SESSION ID名称了,当然这时候HttpOnly属性也没有多大意义了。
有一点别忘记,设置HttpOnly之后,客户端的JS将无法获取的到会话ID了



作者:芥末无疆sss
链接:https://www.jianshu.com/p/c1a0abbeb1af
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/226810.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号