一些安全防护办法
Posted jdkman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些安全防护办法相关的知识,希望对你有一定的参考价值。
Created 星期三 08 三月 2017
Apache JServ protocol service
描述:
AJP(Apache Jserv Protocol)的connector:AJP为二进制协议,专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用。
风险等级:
中。
解决办法:
- 防火墙上关闭tomcat使用的ajp端口8009。
- 或修改tomcat的 server.xml,注释掉ajp connector:
cookie缺少 secure flag
描述:
当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTTPS 连接中被浏览器传递到服务器端进行会话验证,如果是 HTTP 连接则不会传递该信息,所以不会被窃取到Cookie 的具体内容。
解决办法:
(需要配套https使用)。
不同情况不同处理。
对于servlet3.0的web应用,在web.xml中添加:
<session-config>
<cookie-config>
<secure>true<secure>
</cookie-config>
</session-config>
或添加过滤器,过滤器中设置cookie.setSecure(true);
参考文档
http://blog.csdn.net/a19881029/article/details/27536917
cookie 缺少httponly属性
描述:
Web 应用程序设置了不含“HttpOnly”属性的会话 cookie。由于此会话 cookie 不包含“HttpOnly”属性,因此注入站点的恶意脚本可能访问此 cookie,并窃取它的值。任何存储在会话令牌中的信息都可能被窃取,并在稍后用于身份盗窃或用户伪装
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击
解决办法:
php中的设置
PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中
session.cookie_httponly = 1
设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性
当然也支持在代码中来开启:
<?php ini_set("session.cookie_httponly", 1);
// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);
?>
java web应用
对于servlet3.0的web应用,在web.xml中添加:
<cookie-config>
<http-only>true</http-only>
</cookie-config>
参考文档:
- http://blog.csdn.net/ssergsw/article/details/9137785?utm_source=tuicool
- http://blog.sina.com.cn/s/blog_4dd475390102eu7p.html
http明文传输
描述:
使用http传输,可以被攻击者可通过内网嗅探的方式获取系统信息,包括用户名、cookie等。
风险等级:
中。
解决办法:
使用https协议,步骤略。
登陆页面缺少动态验证码
描述:
用户登录只有账户+密码的认证方式,缺少动态验证码机制,容易被暴力破解。
解决办法:
添加验证码登陆机制,步骤略。
服务器启用了不安全的http方法
描述:
服务器允许: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS
风险等级:
中。
解决办法:
建议关闭无用HTTP方法,仅开放允许GET/POST方法。
方法一:
修改所有web应用的web.xml,添加:
<security-constraint> <web-resource-collection> <web-resource-name>Forbidden</web-resource-name> <url-pattern>/*</url-pattern> <http-method>PUT</http-method> <http-method>DELETE</http-method> <http-method>HEAD</http-method> <http-method>OPTIONS</http-method> <http-method>TRACE</http-method> </web-resource-collection> <auth-constraint/> </security-constraint>
方法2:
在nginx里添加限制:
limit_except GET POST {
deny all;
}
http方法说明:
PUT 向指定的目录上载文件
DELETE 删除指定的资源
COPY 将指定的资源复制到Destination消息头指定的位置
MOVE 将指定的资源移动到Destination消息头指定的位置
SEARCH 在一个目录路径中搜索资源
PROPFIND 获取与指定资源有关的信息,如作者、大小与内容类型
TRACE 在响应中返回服务器收到的原始请求
------------------------------------------------------
登陆页面设置失败次数限制
描述:
多次登陆失败后,限制禁止用户登陆。
解决办法:
略。
Clickjacking: X-Frame-Options header missing
描述:
点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。HTTP 响应头信息中的X-Frame-Options,可以指示浏览器是否应该加载一个 iframe 中的页面。如果服务器响应头信息中没有X-Frame-Options,则该网站存在ClickJacking攻击风险。网站可以通过设置 X-Frame-Options 阻止站点内的页面被其他页面嵌入从而防止点击劫持。
解决办法:
修改web服务器配置,添加X-Frame-Options响应头。
赋值有如下三种:1、DENY:不能被嵌入到任何iframe或者frame中。
2、SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中。
3、ALLOW-FROM uri:只能被嵌入到指定域名的框架中。
具体操作:
tomcat配置:
修改conf/web.xml添加下面的过滤器:
<filter>
<filter-name>HTTP Header Security Filter</filter-name>
<filter-class> org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value> DENY或SAMEORIGIN或ALLOW-FROM</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>HTTP Header Security Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
代码实现:
res.addHeader("X-FRAME-OPTIONS",mode );
nginx配置:
配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 ‘http‘, ‘server‘ 或者 ‘location‘ 的配置中:
add_header X-Frame-Options SAMEORIGIN;
Apache配置:
配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 ‘site‘ 的配置中:
Header always append X-Frame-Options SAMEORIGIN
测试方法
参考文档
X-Frame-Options 响应头
https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html
X-Content-Type-Options
风险等级
低
解决办法
修改tomcat 的conf/web.xml添加下面的过滤器:
<filter>
<filter-name>HTTP Header Security Filter</filter-name>
<filter-class> org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HTTP Header Security Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对于nginx
add_header X-Content-Type-Options nosniff; # 禁止嗅探文件类型
参考文档
https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options
X-XSS-Protection
风险等级
低
描述
HTTP X-XSS-Protection 响应头是Internet Explorer,Chrome和Safari的一个功能,当检测到反映的跨站点脚本 (XSS)时,停止页面加载。
解决办法
修改conf/web.xml添加下面的过滤器:
<filter>
<filter-name>HTTP Header Security Filter</filter-name>
<filter-class> org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HTTP Header Security Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
对于nginx
add_header X-XSS-Protection "1; mode=block"; # XSS 保护
参考文档
https://tomcat.apache.org/tomcat-8.0-doc/config/filter.html
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection
httpSlow HTTP DoS漏洞
描述:
针对任意HTTP Server,建立一个连接,以很低的速度发包,并保持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接池将很快被占满,从而导致拒绝服务攻击。
风险等级:
高。
解决办法:
https://community.qualys.com/blogs/securitylabs/2011/11/02/how-to-protect-against-slow-http-attacks
BREACH attack
描述
风险等级:
中
解决办法:
- Disabling HTTP compression(禁止http压缩)
- Separating secrets from user input
- Randomizing secrets per request
- Masking secrets (effectively randomizing by XORing with a random secret per request)
- Protecting vulnerable pages with CSRF
- Length hiding (by adding random number of bytes to the responses)
- Rate-limiting the requests(限制请求速率)
例如:nginx 关闭gzip压缩。
参考文档:
http://breachattack.com/
Password type input with auto-complete enabled
风险等级:
低
解决办法:
<form>
<input type="text" name="username" autocomplete="off">
<input type="password" autocomplete="new-password" onfocus="if (this.hasAttribute(‘readonly‘)) {this.removeAttribute(‘readonly‘);}" readonly >
</form>
参考文档:
https://stackoverflow.com/questions/32369/disable-browser-save-password-functionality
Content Security Policy
风险等级:
低
解决办法
(1)
两种方法可以启用 CSP。一种是通过 HTTP 头信息的Content-Security-Policy的字段。
Content-Security-Policy: script-src ‘self‘; object-src ‘none‘;
style-src cdn.example.org third-party.org; child-src https:
自定义filter
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Content-Security-Policy", "frame-ancestors ‘self‘");
chain.doFilter(request, response);
}
}
另一种是通过网页的标签。
上面代码中,CSP 做了如下配置。
- 脚本:只信任当前域名
- 样式表:只信任cdn.example.org和third-party.org
- 框架(frame):必须使用HTTPS协议加载
- 其他资源:没有限制
参考文档
http://www.ruanyifeng.com/blog/2016/09/csp.html
http://www.jackieathome.net/archives/317.html
以上是关于一些安全防护办法的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Java 中执行不安全的代码(禁用安全管理器)?