前情提要:
因为公司对软件进行安全扫描,发现安全漏洞。需要将现有app软件的登录、注册功能添加图形验证码功能。验证码数据的生成以及校验需要在后台进行。
可参考后台管理系统的登录功能(如下图)。但是研究代码发现该功能的校验是在前台进行的,并且数据是后台生成后直接保存在页面隐藏框中。点击“登录”时进行校验。
后台代码如下:
package com.cpic.caf.hsp.web.controller.verifyCode;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.dcits.common.util.VerifyCodeImg;
@RequestMapping("/ui/verifyCode")
@Controller
public class VerifyCode {
/* 获取验证码图片 */
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/getVerifyCode")
@ResponseBody
public void getVerificationCode(HttpServletResponse response,
HttpServletRequest request,HttpSession session) {
try {
int width = 180;
int height = 45;
BufferedImage verifyImg = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 生成对应宽高的初始图片
String randomText = VerifyCodeImg.drawRandomText(width, height,
verifyImg);
// 单独的一个类方法,出于代码复用考虑,进行了封装。
// 功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符
request.getSession().setAttribute("verifyCode", randomText);
response.setContentType("image/png");// 必须设置响应内容类型为图片,否则前台不识别
OutputStream os = response.getOutputStream(); // 获取文件输出流
ImageIO.write(verifyImg, "png", os);// 输出图片流
os.flush();
os.close();// 关闭流
} catch (IOException e) {
this.logger.error(e.getMessage());
logger.info("异常信息:",e);
}
}
@RequestMapping("/checkVerifyCode")
@ResponseBody
public Map<String,Object> checkVerifyCode(HttpServletResponse response,
HttpServletRequest request,HttpSession session,String code) {
Map<String,Object> map = new HashMap<String, Object>();
String sessi