安云网 - AnYun.ORG | 专注于网络信息收集、网络数据分享、网络安全研究、网络各种猎奇八卦。
当前位置: 安云网 > 技术关注 > 网络安全 > 实战SpringMVC+Mybatis搭建高性能安全站点

实战SpringMVC+Mybatis搭建高性能安全站点

时间:2017-06-02来源:未知 作者:安云网点击:
最近公司后端程序员缺乏,我这个前端冒死受命玩起了JavaEE项目,借助开源的力量( spring-shiro-training )搭建了一个JavaEE项目,经过改造成符合我们需要,主要是数据库结构改动,下面简单记录一下Spring+MyBatis项目的一些玩法。 一

最近公司后端程序员缺乏,我这个前端冒死受命玩起了JavaEE项目,借助开源的力量(spring-shiro-training)搭建了一个JavaEE项目,经过改造成符合我们需要,主要是数据库结构改动,下面简单记录一下Spring+MyBatis项目的一些玩法。 //安云网咨询系统

一、网站安全 //本文来自安云网

1.1 XSS跨站脚本

XSS又称CSS,全称Cross Site Script,跨站脚本攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。

//copyright AnYun.ORG

一个简单的例子,页面名字叫test.jsp:

//本文来自安云网

<html>   
   <head>     
      <title>XSS测试</title>   
   </head>   
   <body>     
      页面内容:<%=request.getParameter("content")%>   
   </body></html> //安云网,anyun.org 

请求下面链接就会出现问题了: //copyright AnYun.ORG

http://www.domain.com/test.jsp?content=<script>alert('XSS注入');</script> //copyright AnYun.ORG 

1.2 SQL注入

SQL Injection,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

//本文来自安云网

典型例子:
国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露。 //安云网,anyun.org

一个简单的例子,比如请求连接获取用户信息
请求连接为:http://www.example.com/user?userId=1
通常代码中会执行SQL语句: //内容来自安云网

select * from table_user where userId=${userId} 
//ANYUN.ORG

假如SQL注入
请求连接为:http://www.example.com/user?userId=1 or 1=1
SQL会执行: //copyright AnYun.ORG

select * from table_user where userId=1 or 1=1 

//本文来自安云网

二、解决之道 ─ 使用HttpServletRequestWrapper类 //内容来自安云网

定义一个Filter,使用HttpServletRequestWrapper类截获并处理参数: //copyright AnYun.ORG

  • < --> <

    //copyright AnYun.ORG

  • > --> >

    //内容来自安云网

  • ( --> ( //本文来自安云网

  • ) --> ) //copyright AnYun.ORG

  • ' --> '

    //安云网,anyun.org

  • eval((.*)) --> 

    //内容来自AnYun.ORG

  • [\"\'][\s]*javascript:(.*)[\"\'] -->  //本文来自安云网

  • script --> 

    //安云网,anyun.org

2.1 定义XssFilter过滤器类

package com.dunizb.demo.common;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class XssFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }} 

//安云网,anyun.org

2.2 在web.xml中配置过滤器

<filter>
  <filter-name>XssFilter</filter-name>
  <filter-class>com.jikexueyuan.demo.common.XssFilter</filter-class></filter><filter-mapping>
  <filter-name>XssFilter</filter-name>
  <url-pattern>*.html</url-pattern></filter-mapping> //ANYUN.ORG 

2.3 使用HttpServletRequestWrapper拦截请求

package com.dunizb.demo.common;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class XssHttpServletRequestWraper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWraper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        return clearXss(super.getParameter(name));
    }

    @Override
    public String getHeader(String name) {
        return clearXss(super.getHeader(name));
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        String[] newValues = new String[values.length];

        for(int i =0; i< values.length; i++){
            newValues[i] = clearXss(values[i]);
        }
        return newValues;
    }

    /**
     * 处理字符转义
     * @param value
     * @return
     */
    private String clearXss(String value){
        if (value == null || "".equals(value)) {
            return value;
        }
        value = value.replaceAll("<", "<").replaceAll(">", ">");
        value = value.replaceAll("\\(", "(").replace("\\)", ")");
        value = value.replaceAll("'", "'");
        value = value.replaceAll("eval\\((.*)\\)", "");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replace("script", "");
        return value;
    }} //本文来自安云网 

三、提升性能:使用Mybatis的二级缓存策略

//内容来自安云网

一级缓存是SqlSession级别的缓存,MyBatis默认开启一级缓存。

//安云网咨询系统

二级缓存是mapper级别的缓存,是多个SqlSession共享的,其作用域是mapper的同一个namespace,MyBatis默认没有开启二级缓存,需要在setting全局参数中配置开启二级缓存。如果缓存中有数据就不用从数据库中获取,大大提高系统性能。 //本文来自安云网

3.1 配置缓存

mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。Mybatis缓存使用起来非常方便,三个配置就搞定: //安云网咨询系统

第一个需要配置config.xml ,开启缓存

//ANYUN.ORG

<setting name="cacheEnabled" value="true" /> //本文来自安云网 

第二个需要在M apper文件头指定使用缓存

//内容来自安云网

<cache readOnly="true" size="500" flushInterval="120000" eviction="LRU"/> 

//安云网,anyun.org

其中:
readOnly="true"则所有相同的SQL语句返回的是同一个对象,这样有助于提高性能,但并发操作同一条数据时可能不安全,如果设置为false,则相同的SQL语句访问的是cache中的副本。 //ANYUN.ORG

size=500是指缓存多少个对象,默认值是1024。

//安云网咨询系统

flushInterval="120000"指定缓存过期的时间,单位为毫秒,默认是空,也就是说只要容量足够永远不会过期。

//copyright AnYun.ORG

eviction="LRU"是缓存的淘汰算法,默认算法是最近最少使用算法,也就是LRU。 //内容来自安云网

第三个配置,在具体的SQ L语句处指定使用缓存,默认开启

//安云网,anyun.org

<select id="selectCount" useCache="true">   
    ...</select> //内容来自AnYun.ORG 

3.2 缓存策略

Mybatis有4个最常见的缓存策略:

//安云网,anyun.org

  • LRU,最近最少使用,移除最长时间不被使用的对象,默认策略

    //ANYUN.ORG

  • FIFO,先进先出,按对象进入缓存的顺序来移除它们 //内容来自AnYun.ORG

  • SOFT,软引用,移除基于垃圾回收器状态和软引用规则的对象

    //内容来自AnYun.ORG

  • WEAK,弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象 //ANYUN.ORG

四、在Linux服务器上部署项目 //内容来自AnYun.ORG

需要Linux操作系统具备如下环境: //copyright AnYun.ORG

  1. JDK7+ //copyright AnYun.ORG

  2. Tomcat7+ //本文来自安云网

  3. MySQL5 //本文来自安云网

  4. Nginx //内容来自安云网

部署过程:

//本文来自安云网

  1. 导出项目为war包,重命名为ROOT.war //安云网咨询系统

  2. 上传到服务器Tomcat的webapps目录

    //安云网,anyun.org

  3. 把本地的MySQL数据库导入到服务器上,把xxx.sql上传到服务器

    //安云网咨询系统

  4. 创建数据库: //安云网咨询系统

    • 连接数据库:mysql -uroot -p //安云网,anyun.org

    • 显示数据库:show database;

      //内容来自AnYun.ORG

    • 创建数据库:create database 数据库名

      //内容来自AnYun.ORG

    • 打开创建的数据库:use 数据库名

      //安云网咨询系统

    • 执行xxx.sql文件:source /expost/tomcat/webapps/xxx.sql //安云网,anyun.org

    • 显示数据库中的表:show tables; //ANYUN.ORG

    • 退出MySQL:exit

      //内容来自安云网

  5. 定义Tomcat端口号为8080:vi config/server.xml

    //ANYUN.ORG

  6. 退出vi编辑器::wq

    //安云网咨询系统

  7. 启动Tomcat:./bin/startup.sh,观察日志:tail -f logs/catalina.out //内容来自AnYun.ORG


作者: Dunizb 
链接:http://www.imooc.com/article/14165?block_id=tuijian_wz
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!

//安云网咨询系统

from    http://www.imooc.com/article/14165?block_id=tuijian_wz

//内容来自AnYun.ORG

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
相关内容