在公司给客户做的一个项目中,客户使用绿盟进行了项目漏洞扫描,这里记录一下我做的一些漏洞修复方法。
由于我使用的是Nginx,因此只需要在Nginx的配置文件里面配置,使项目只能以指定域名(由于没有提供域名,设置的是ip)来访问,如下在设置server_name,这里可以使用多个域名),如果使用其他域名(如localhost)访问直接返回403。配置示例如下:
server{
listen 8082 default;
server_name _;
return 403;
}
server {
listen 8082;
server_name 我的域名 127.0.0.1
…其他配置
}
上面的配置,注意第一个server中,代表除了用下面server中配置的域名来访问系统,其他会返回403页面。
在Resin3.1中,直接在项目配置文件conf中放开cookie-http-only,就能实现HttpOnly的添加。
在Resin4中,已经去除了cookie-http-only,因此需要代码来辅助添加。网上普遍的说法是在增加过滤器,然后在过滤器中添加如下代码:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
Cookie[] cookies = request.getCookies();
StringBuffer sb = new StringBuffer();
String oldSetCookie = null;
if(cookies!=null){
for(Cookie cookie : cookies){
if(cookie!=null){
String newCookie = cookie.getName()+"="+cookie.getValue()+";";
if(cookie.getPath()!=null){
newCookie+="Path="+cookie.getPath()+";";
}
if(oldSetCookie!=null && oldSetCookie.indexOf(newCookie)>-1){
}else{
sb.append(newCookie);
oldSetCookie = sb.toString();
}
}
}
if(sb.length()>0){
response.setHeader("Set-Cookie",sb.append("Path=/;HttpOnly;").toString());
}
}
以上代码是在Servlet2.5下的操作,在Servlet3.0下可以使用更简单的操作,具体的操作为:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie cookie : cookies){
if(cookie!=null){
cookie.setHttpOnly(true);
response.addCookie(cookie);
}
}
if(sb.length()>0){
response.setHeader("Set-Cookie",sb.append("Path=/;HttpOnly;").toString());
}
}
创建了CookieFilter,然后在web.xml声明,并设置过滤所有请求:
cookieFilter
com.filter.CookieFilter
cookieFilter
/*
但是在实际使用中,发现并没有起到应有的作用,还是能被扫描出来.于是又找寻了另外的方法,具体使用是使用了监听器,设置了SessionCookieConfig的HttpOnly属性,具体操作如下:
创建监听器,实现javax.servlet.ServletContextListener接口:
package com;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.SessionCookieConfig;
import javax.servlet.annotation.WebListener;
@WebListener
public class CookieConfigInitializer implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
}
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
//这里只是添加了HttpOnly,也能添加其他属性如Secure,Path
SessionCookieConfig sessionCookieConfig = contextEvent.getServletContext().getSessionCookieConfig();
sessionCookieConfig.setHttpOnly(true);
}
}
然后在web.xml声明这个监听器
com.CookieConfigInitializer
漏洞说明:不配置这个Header,会让我们的网页能被任何页面使用Frame引用到,如果想要自己的网页只能被指定域名的Frame包裹就需要设置这个属性.
在Nginx里面,设置方法为在nginx的配置文件对应server里面添加如下代码:
#设置允许将系统作为iframe添加的地址
add_header X-Frame-Options 允许iframe的IP;
add_header X-Frame-Options 允许ifame的域名;
#下面这句是因为Google浏览器不支持上面的头信息
add_header Content-Security-Policy "允许iframe的IP 允许ifame的域名 'self'";
注意:这里针对Google做了不同的处理,因为在Google浏览器 X-Frame_Options没阻止被非合法IP 或域名网站使用iframe引用我们的网站。
如果是直接在代码中添加,应该是可以使用过滤器或者拦截器,使用response.addHeader(name,value)增加response的Header。