一些安全防护办法

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

描述:

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

描述

风险等级:

解决办法:

  1. Disabling HTTP compression(禁止http压缩)
  2. Separating secrets from user input
  3. Randomizing secrets per request
  4. Masking secrets (effectively randomizing by XORing with a random secret per request)
  5. Protecting vulnerable pages with CSRF
  6. Length hiding (by adding random number of bytes to the responses)
  7. 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 中执行不安全的代码(禁用安全管理器)?

有没有办法在使用 Asp.Net MVC ActionLink、RedirectToAction 等时包含片段标识符?

Android - 片段中的 getIntent()

有没有办法在对话框片段前面打开一个导航抽屉

基于散列片段的安全性究竟是如何工作的?

Java经典安全数组实现的代码