我想让我的cookie安全,只有http请求。
我见过像qazxsw poi这样的帖子似乎工作得很好,但是使用配置文件和servlet +3。
我基本上想要做的是仅设置我的cookie http和(如果可能的话)ssl。
到目前为止,我已将其添加到我的web.xml中
this
什么都不做,就我读到的而言,我还必须配置我的servlet.xml以启用此功能,但我不知道如何...
知道怎么做吗?
编辑:
由于我使用的是servlet 2.5,xml配置不是一个选项,可能是一个过滤器?
我讨厌XML配置,所以我花了一些时间来寻找非XML解决方案。
自Spring Security 1.3起,您就可以使用了
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
在您的application.properties文件中。
也许有一种方法可以使用纯Java配置来设置它,但我找不到它们。
我们最近遇到了这个问题。我尝试了http-only的属性设置,它在本地工作,但是当我们部署到我们的测试环境时没有。 env中有一些默认设置可能会覆盖这些本地设置。有用的是在Spring配置文件中设置属性:
server.session.cookie.http-only=true
server.session.cookie.secure=true
javagc提到的context.xml更改只会重新配置会话cookie。
要更改所有Cookie,您有两种选择:
选项1)更新应用程序代码以使用更安全的方法添加cookie。示例:@Bean
public ServletContextInitializer servletContextInitializer() {
return new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
sessionCookieConfig.setSecure(true);
}
};
}
选项2)您可以配置servlet过滤器以更改通过系统的所有(其他)cookie。将这两个类添加到WAR中的相应包中。然后更新您的web.xml,详情如下。
如果您愿意在OWASP库上添加依赖项,那么在OWASP站点上列出的选项2有一个更简单的示例。它位于这里:https://stackoverflow.com/a/30488471/95674
这会将http唯一标志添加到包装响应的所有Cookie中。
https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly
此Filter在上面的包装器中包装已配置的响应。
public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {
public HttpOnlyResponseWrapper(HttpServletResponse res) {
super(res);
}
public void addCookie(Cookie cookie) {
StringBuilder header = new StringBuilder();
if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
header.append(cookie.getName());
}
if (cookie.getValue() != null) {
// Empty values allowed for deleting cookie
header.append("=" + cookie.getValue());
}
if (cookie.getVersion() == 1) {
header.append(";Version=1");
if (cookie.getComment() != null) {
header.append(";Comment=\"" + cookie.getComment() + "\"");
}
if (cookie.getMaxAge() > -1) {
header.append(";Max-Age=" + cookie.getMaxAge());
}
} else {
if (cookie.getMaxAge() > -1) {
Date now = new Date();
now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
header.append(";Expires=" + cookieFormat.format(now));
}
}
if (cookie.getDomain() != null) {
header.append(";Domain=" + cookie.getDomain());
}
if (cookie.getPath() != null) {
header.append(";Path=" + cookie.getPath());
}
if (cookie.getSecure()) {
header.append(";Secure");
}
header.append(";httpOnly");
addHeader("Set-Cookie", header.toString());
}
}
从源代码改编(警告:不是完全复制!):package yourpackage;
@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
this.config = null;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
chain.doFilter(req, hres);
}
public FilterConfig getFilterConfig() {
return this.config;
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
最后一个细节:只有在您的系统中关闭注释扫描时才会这样:
http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html
然后,您需要在web.xml文件中手动配置上面的Filter,如下所示:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
version="2.5" ***metadata-complete="true"***>
</web-app>
如果您的应用程序扫描注释(这是默认设置),则不需要web.xml部分。
在ServletContextListener的帮助下,我们可以在tomcat启动和关闭时在servlet上进行控制。所以在tomcat启动时我们正在设置httponly的配置。
<filter>
<filter-name>HttpOnlyFilter
<filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
<filter-name>HttpOnlyFilter
<url-pattern>/*
</filter-mapping>
图下面是web.xml中的条目
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public final class ContextListener implements ServletContextListener {
private ServletContext context = null;
@Override
public void contextDestroyed(ServletContextEvent event) {
this.context = null;
}
@Override
public void contextInitialized(ServletContextEvent event) {
this.context = event.getServletContext();
this.context.getSessionCookieConfig().setHttpOnly(true);
}
}
我相信你错过了安全标签。尝试添加:
<listener>
<description>contextListener</description>
<listener-class>
main.ContextListener
</listener-class>
</listener>