资讯专栏INFORMATION COLUMN

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

darry / 3396人阅读

摘要:一网站安全跨站脚本又称,全称,跨站脚本攻击,是程序中常见的漏洞,属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。典型例子国内最大的程序员社区网站的用户数据库被黑客公开发布,万用户的登录名及密码被公开泄露。

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

一、网站安全 1.1 XSS跨站脚本

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

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

   
        
      XSS测试   
      
        
      页面内容:<%=request.getParameter("content")%>   
   

请求下面链接就会出现问题了:

http://www.domain.com/test.jsp?content=
1.2 SQL注入

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

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

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

select * from table_user where userId=${userId}

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

select * from table_user where userId=1 or 1=1
二、解决之道 ─ 使用HttpServletRequestWrapper类

定义一个Filter,使用HttpServletRequestWrapper类截获并处理参数:

< --> <

> --> >

( --> (

) --> )

" --> "

eval((.*)) -->

[""][s]*javascript:(.*)[""] -->

script -->

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
    }
}
2.2 在web.xml中配置过滤器

  XssFilter
  com.jikexueyuan.demo.common.XssFilter


  XssFilter
  *.html
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 ,开启缓存

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

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

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

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

eviction="LRU"是缓存的淘汰算法,默认算法是最近最少使用算法,也就是LRU。

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

3.2 缓存策略

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

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

FIFO,先进先出,按对象进入缓存的顺序来移除它们

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

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

四、在Linux服务器上部署项目

需要Linux操作系统具备如下环境:

JDK7+

Tomcat7+

MySQL5

Nginx

部署过程:

导出项目为war包,重命名为ROOT.war

上传到服务器Tomcat的webapps目录

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

创建数据库:

连接数据库:mysql -uroot -p

显示数据库:show database;

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

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

执行xxx.sql文件:source /expost/tomcat/webapps/xxx.sql

显示数据库中的表:show tables;

退出MySQL:exit

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

退出vi编辑器::wq

启动Tomcat:./bin/startup.sh,观察日志:tail -f logs/catalina.out


本文首发于慕课网

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9626.html

相关文章

  • Java后端

    摘要:,面向切面编程,中最主要的是用于事务方面的使用。目标达成后还会有去构建微服务,希望大家多多支持。原文地址手把手教程优雅的应用四手把手实现后端搭建第四期 SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Spring 两大核心之 AOP 学习 | 掘金技术征文 原本地址:SpringMVC 干货系列:从零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 评论0 收藏0
  • 后台 - 收藏集 - 掘金

    摘要:探究系统登录验证码的实现后端掘金验证码生成类手把手教程后端博客系统第一章掘金转眼间时间就从月份到现在的十一月份了。提供了与标准不同的工作方式我的后端书架后端掘金我的后端书架月前本书架主要针对后端开发与架构。 Spring Boot干货系列总纲 | 掘金技术征文 - 掘金原本地址:Spring Boot干货系列总纲博客地址:http://tengj.top/ 前言 博主16年认识Spin...

    CrazyCodes 评论0 收藏0
  • Java入门基础知识点总结(详细篇)

    摘要:深入理解数据库管理系统通用知识及数据库的使用与管理。为后台开发打下坚实基础。项目文档,项目规范,需求分析,数据库设计,工程构建,需求评审,配置管理,修复,项目管理等。 很多新手在学习java的时候都比较迷茫,不知道从哪里开始学起,这里就给大家整理了一份java开发学习路线,比较系统全面,可参...

    shinezejian 评论0 收藏0
  • 【Java】基于Maven搭建Spring+SpringMVC+Mybatis框架

    摘要:关于的配置,可以参考这篇文章的第一个小节配置模板引擎搭什么搭直接用脚手架不行吗下载就能用下载就能用下载就能用码云咳咳,开个玩笑,如果本着学习态度的话,那就慢慢啃吧搭建空的项目使用搭建基本的空项目填写和,,选择项目的地址,在新的窗口打开最 关于springMVC的配置,可以参考这篇文章的第一个小节:【java】intellij idea SpringMVC 配置FreeMarker模板引...

    edagarli 评论0 收藏0
  • Java 类文章 - 收藏集 - 掘金

    摘要:而调用后端服务就应用了的高级特分布式配置管理平台后端掘金轻量的分布式配置管理平台。关于网络深度解读后端掘金什么是网络呢总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器。 在 Java 路上,我看过的一些书、源码和框架(持续更新) - 后端 - 掘金简书 占小狼转载请注明原创出处,谢谢!如果读完觉得有收获的话,欢迎点赞加关注 物有本末,事有终始,知所先后,则近道矣 ......

    RayKr 评论0 收藏0

发表评论

0条评论

darry

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<