大家好,又见面了,我是你们的朋友全栈君。
HttpOnly是微软公司的Internet Explorer 6 SP1引入的一项新特性。这个特性为cookie提供了一个新属性,用以阻止客户端脚本访问Cookie,至今已经称为一个标准,几乎所有的浏览器都会支持HttpOnly。 下面示例显示了HTTP响应标头中HttpOnly使用的语法:
代码语言:javascript复制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 :
代码语言:javascript复制cookie.setHttpOnly(true);
此外,从 JEE 6 开始,HttpOnly 通过以下配置,去设置HttpOnly:
代码语言:javascript复制<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
对于JEE 6之前的Java Enterprise Edition 版本,常见的解决方法是:SET-COOKIE,使用会话cookie值覆盖HTTP响应标头,该值显式附加HttpOnly标志:
代码语言:javascript复制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 如下:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myWebApplicationPath" useHttpOnly="true">
JBoss 5.0.1和JBOSS EAP 5.0.1在 server <myJBossServerInstance> deployjbossweb.sarcontext.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。
代码语言:javascript复制<httpCookies httpOnlyCookies="true" …>
或以编程方式 C# 代码:
代码语言:javascript复制HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.HttpOnly = true;
Response.AppendCookie(myCookie);
VB.NET 代码:
代码语言:javascript复制Dim myCookie As HttpCookie = new HttpCookie("myCookie")
myCookie.HttpOnly = True
Response.AppendCookie(myCookie)
但是,在.NET 1.1 中,必须手动执行此操作:
代码语言:javascript复制Response.Cookies[cookie].Path = ";HttpOnly";
使用 Python 设置 HttpOnly: 要在 Cherrypy 会话中使用 HTTP-Only cookie,只需在配置文件中添加以下行:
代码语言:javascript复制 tools.sessions.httponly = True
如果使用 SLL,还可以避免中间人攻击:
tools.sessions.secure = True
使用 PHP 设置 HttpOnly: PHP 从 5.2.0 开始支持设置 HttpOnly 标志,对于由 PHP 管理的会话 cookie,通过在php.ini中设置HttpOnly:
代码语言:javascript复制session.cookie_httponly = True
或通过函数:
代码语言:javascript复制void session_set_cookie_params ( int $lifetime [, string $path [, string $domain[, bool $secure= false [, bool $httponly= false ]]]] )
对于应用程序 cookie, setcookie() 中的最后一个参数设置 HttpOnly :
代码语言:javascript复制bool setcookie ( string $name [, string $value [, int $expire= 0 [, string $path[, string $domain [, bool $secure= false [, bool $httponly= false ]]]]]] )
Web 应用程序防火墙: 如果代码更改不可行,可以使用 Web 应用程序防火墙将 HttpOnly 添加到会话 cookie:
代码语言:javascript复制Mod_security - 使用 SecRule 和 Header
ESAPI WAF 9 使用add-http-only-flag
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147505.html原文链接:https://javaforall.cn