web渗透测试—-33、HttpOnly[通俗易懂]

web渗透测试—-33、HttpOnly[通俗易懂]HttpOnly是微软公司的InternetExplorer6SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。下面示例显示了HTTP响应标头中HttpOnly使用的语法:Set-Cookie:<name>=<value>[;<Max-Age>=<age>]`[;expires=<date>][;domain=&lt

大家好,又见面了,我是你们的朋友全栈君。

HttpOnly是微软公司的Internet Explorer 6 SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。
下面示例显示了HTTP响应标头中HttpOnly使用的语法:

Set-Cookie: <name>=<value>[; <Max-Age>=<age>]
`[; expires=<date>][; domain=<domain_name>]
[; path=<some_path>][; secure][; HttpOnly]

如果HTTP响应标头包含HttpOnly,则无法通过客户端脚本访问Cookie;因此,即使系统存在跨站脚本攻击,并且用户不小心访问了利用此缺陷的链接,浏览器也不会将Cookie泄露给第三方。
如果支持HttpOnly的浏览器检测到包含HttpOnly标志的Cookie,并且客户端脚本代码尝试读取Cookie,则浏览器将返回一个空字符串作为结果,以阻止XSS代码将数据发送到攻击者的网站,从而导致攻击失败。

使用 Java 设置 HttpOnly:
从采用 Java Servlet 3.0 技术的 Java Enterprise Edition 6 (JEE6) 开始,就可以在 cookie 上以编程方式设置 HttpOnly 标志。JEE6、JEE7 都可以通过isHttpOnly方法设置HttpOnly :

cookie.setHttpOnly(true);

此外,从 JEE 6 开始,HttpOnly 通过以下配置,去设置HttpOnly:

<session-config>
   <cookie-config>
    <http-only>true</http-only>
   </cookie-config>
</session-config>

对于JEE 6之前的Java Enterprise Edition 版本,常见的解决方法是:SET-COOKIE,使用会话cookie值覆盖HTTP响应标头,该值显式附加HttpOnly标志:

String sessionid = request.getSession().getId();
// be careful overwriting: JSESSIONID may have been set with other flags
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");

在这种情况下,尽管对HttpOnly 标志合适,但不鼓励覆盖,因为 JSESSIONID 可能已设置为其他标志。更好的解决方法是处理先前设置的标志或使用ESAPI#Java_EE库,我们可以编写一个 servlet 过滤器,如下所示:SecurityWrapperResponse

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { 
   
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    // if errors exist then create a sanitized cookie header and continue
    SecurityWrapperResponse securityWrapperResponse = new SecurityWrapperResponse(httpServletResponse, "sanitize");
    Cookie[] cookies = httpServletRequest.getCookies();
    if (cookies != null) { 
   
        for (int i = 0; i < cookies.length; i++) { 
   
            Cookie cookie = cookies[i];
            if (cookie != null) { 
   
                // ESAPI.securityConfiguration().getHttpSessionIdName() returns JSESSIONID by default configuration
                if (ESAPI.securityConfiguration().getHttpSessionIdName().equals(cookie.getName())) { 
   
                    securityWrapperResponse.addCookie(cookie);
                }
            }
        }
    }
    filterChain.doFilter(request, response);
}

一些实现JEE5的Web应用程序服务器和实现Java Servlet 2.5(JEE 5 的一部分)的servlet 容器也允许创建HttpOnly会话cookie:
Tomcat 6在context.xml设置的Context属性useHttpOnly 如下:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myWebApplicationPath" useHttpOnly="true">
JBoss 5.0.1和JBOSS EAP 5.0.1在 server <myJBossServerInstance> \deploy\jbossweb.sar\context.xml 设置SessionCookie标签 5如下:
<Context cookies="true" crossContext="true">
    <SessionCookie secure="true" httpOnly="true" />

IBM Websphere为会话 cookie 提供 HTTPOnly 作为配置选项,使用 .NET 设置 HttpOnly,在 .NET 2.0 中,还可以通过 HttpCookie 对象为所有自定义应用程序 cookie 设置 HttpOnly。

<httpCookies httpOnlyCookies="true"> 

或以编程方式
C# 代码:

HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);

VB.NET 代码:

Dim myCookie As HttpCookie = new HttpCookie("myCookie")
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)

但是,在.NET 1.1 中,必须手动执行此操作:

Response.Cookies[cookie].Path += ";HttpOnly";

使用 Python 设置 HttpOnly:
要在 Cherrypy 会话中使用 HTTP-Only cookie,只需在配置文件中添加以下行:

 tools.sessions.httponly = True 
 如果使用 SLL,还可以避免中间人攻击:
  tools.sessions.secure = True

使用 PHP 设置 HttpOnly:
PHP 从 5.2.0 开始支持设置 HttpOnly 标志,对于由 PHP 管理的会话 cookie,通过在php.ini中设置HttpOnly:

session.cookie_httponly = True

或通过函数:

void session_set_cookie_params  ( int $lifetime  [, string $path  [, string $domain[, bool $secure= false  [, bool $httponly= false  ]]]] )

对于应用程序 cookie, setcookie() 中的最后一个参数设置 HttpOnly :

bool setcookie  ( string $name  [, string $value  [, int $expire= 0  [, string $path[, string $domain  [, bool $secure= false  [, bool $httponly= false  ]]]]]] )

Web 应用程序防火墙:
如果代码更改不可行,可以使用 Web 应用程序防火墙将 HttpOnly 添加到会话 cookie:

Mod_security - 使用 SecRule 和 Header 
ESAPI WAF 9 使用add-http-only-flag 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147505.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Perl正则表达式超详细教程

    Perl正则表达式超详细教程前言想必学习perl的人,对基础正则表达式都已经熟悉,所以学习perl正则会很轻松。这里我不打算解释基础正则的内容,而是直接介绍基础正则中不具备的但perl支持的功能。关于基础正则表达式的内容,可参阅基础正则表达式。我第一个要说明的是,perl如何使用正则。还记得当初把《精通正则表达式》的书看了一遍,把perl正则也学了个七七八八,但是学完后却不知道怎么去使用perl正则,虽然里面也介绍了一点…

    2022年5月6日
    33
  • C语言描述 动态规划 背包问题

    C语言描述 动态规划 背包问题动态规划作为不同于其他类型的问题,有着它自己的解题思路以及模型,以下将围绕模型以及解题思路两方面进行讲解。1.模型:有已知推到未知,是我们常用的解题思路,好比数独中如果我们有了1~8那么剩下的格子必然是9了。动态规划也是这样的思路,眼下我们有一堆货物和一个容量有限的背包,那么如何装才能利益最大化便是我们需要考虑的问题。也就是背包问题。仔细思考,不难发现,每个物品都只有0与1(0表示不装,1表示装入)两个状态,那么一串二进制数就可以表示物品的装配方案(如0101表示只带上第2、4件物品)由此必有2

    2022年7月26日
    2
  • String转换jsonobject格式错误

    String转换jsonobject格式错误String转换jsonobject格式错误开发工具与关键技术:java作者:彭浩达撰写时间:2019年7月24日publicvoidUpdataecdrud(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,I…

    2022年8月23日
    6
  • 中国电信天翼光猫改桥接模式密码_电信光猫路由模式

    中国电信天翼光猫改桥接模式密码_电信光猫路由模式使用默认超级管理员账号密码进去telecomadminnE7jA%5m然后在网络设置里改再把路由器使用宽带拨号上网就OK了

    2022年10月8日
    0
  • MyBatis——动态SQL总结

    MyBatis——动态SQL总结MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有:ifwheresetchoose(when,otherwise)trimforeach   (1)if标签此时如果CNAINDCLABASINFID为null,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null…

    2022年6月23日
    22
  • vue跨域解决的几种方案「建议收藏」

    vue跨域解决的几种方案「建议收藏」vue跨域解决的几种方案一、开发环境解决跨域方法平时使用vue开发的时候,大多会使用vue-cli搭建项目,在vue-cli搭建的项目中有一个配置文件vue.config.js,可以在该文件中进行相应的配置解决开发环境的跨域问题。第一步设置公共urlapi/index.jsimportaxiosfrom’axios’importrouterfrom’@/router/index.js’importstorefrom’@/store/index.js’//创建一个axios

    2022年10月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号