图形验证码实现方案(解决短信轰炸问题)

最近收到leader的一个邮件说我们的项目有短信轰炸风险。顿时让一个做技术开发的人为之一颤。今天给大家介绍一个解决这个问题的使用工具。

就是谷歌的 kaptcha 进行验证码生成和校验。闲话少说直接上代码。

1. 首先下载一个工具包

<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>

2. 建立一个spring工程填写相关代码。 两个方法一个是获取图形验证码 一个是用于验证。

@Controller
@RequestMapping("/kaptcha")
public class kaptchaController {
    @Autowired
    private Producer captchaProducer = null;

    @RequestMapping("/getKaptchaImage")
    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute(Constants.KAPTCHA_SESSION_KEY);
        System.out.println("******************验证码是: " + code + "******************");

        response.setDateHeader("Expires", 0);

        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");

        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");

        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");

        // return a jpeg
        response.setContentType("image/jpeg");

        // create the text for the image
        String capText = captchaProducer.createText();

        // store the text in the session
        session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);

        // create the image with the text
        BufferedImage bi = captchaProducer.createImage(capText);
        ServletOutputStream out = response.getOutputStream();

        // write the data out
        ImageIO.write(bi, "jpg", out);
        try {
            out.flush();
        } finally {
            out.close();
        }
        return null;
    }
    @RequestMapping("/check")
    public String check(HttpServletRequest request){
        //从session中取出servlet生成的验证码text值
        String kaptchaExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
        //获取用户页面输入的验证码
        String kaptchaReceived = request.getParameter("kaptcha");
        //校验验证码是否正确
        if (kaptchaReceived == null || !kaptchaReceived.equalsIgnoreCase(kaptchaExpected)){
            return "false";
        }
        return "true";
    }
    @RequestMapping("/index")
    public String index(HttpServletRequest request){
        return "kaptcha";
    }

}

3. springmvc.xml中加上配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--指明 controller 所在包,并扫描其中的注解-->
    <context:component-scan base-package="com.mzq" />
    <!-- 静态资源(js、image等)的访问 -->
    <mvc:default-servlet-handler/>

    <!-- 通过annotation-driven可以替代下边的处理器映射器和适配器 -->
    <mvc:annotation-driven />
    <!--静态资源解析 -->
    <mvc:resources mapping="/js/**" location="/WEB-INF/js/" />
    <mvc:resources mapping="/css/**" location="/WEB-INF/css/" />
    <mvc:resources mapping="/img/**" location="/WEB-INF/img/" />

    <!--ViewResolver 视图解析器-->
    <!--用于支持Servlet、JSP视图解析-->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 定义统一异常处理器 -->
    <bean class="com.mzq.exception.MyExceptionResolver"></bean>

<!--
kaptcha.border.color   边框颜色   默认为Color.BLACK
kaptcha.border.thickness  边框粗细度  默认为1
kaptcha.producer.impl   验证码生成器  默认为DefaultKaptcha
kaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreator
kaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwx
kaptcha.textproducer.char.length   验证码文本字符长度  默认为5
kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
kaptcha.textproducer.font.size   验证码文本字符大小  默认为40
kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACK
kaptcha.textproducer.char.space  验证码文本字符间距  默认为2
kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoise
kaptcha.noise.color   验证码噪点颜色   默认为Color.BLACK
kaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipple
kaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRenderer
kaptcha.background.impl   验证码背景生成器   默认为DefaultBackground
kaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAY
kaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITE
kaptcha.image.width   验证码图片宽度  默认为200
kaptcha.image.height  验证码图片高度  默认为50
 -->
    <bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
        <property name="config">
            <bean class="com.google.code.kaptcha.util.Config">
                <constructor-arg>
                    <props>
                        <prop key="kaptcha.border">no</prop>
                        <prop key="kaptcha.border.color">105,179,90</prop>
                        <prop key="kaptcha.textproducer.font.color">black</prop>
                        <prop key="kaptcha.image.width">100</prop>
                        <prop key="kaptcha.image.height">40</prop>
                        <prop key="kaptcha.textproducer.font.size">30</prop>
                        <prop key="kaptcha.session.key">code</prop>
                        <prop key="kaptcha.textproducer.char.length">4</prop>
                        <prop key="kaptcha.textproducer.font.names">宋体,楷体,微软雅黑</prop>
                    </props>
                </constructor-arg>
            </bean>
        </property>
        </bean>

</beans>

4. 写一个JSP页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="../js/jquery-1.11.0.min.js"></script>
<!-- <script type="text/javascript" src="../js/functions.js"></script>   -->

<title>测试页面</title>
<script type="text/javascript">
$(function(){
    $(‘#kaptchaImage‘).click(function () {//生成验证码
     $(this).hide().attr(‘src‘, ‘../kaptcha/getKaptchaImage?‘ + Math.floor(Math.random()*100) ).fadeIn();
     event.cancelBubble=true;
    });
});   

window.onbeforeunload = function(){
    //关闭窗口时自动退出
    if(event.clientX>360&&event.clientY<0||event.altKey){
        alert(parent.document.location);
    }
};  

function changeCode() {
    $(‘#kaptchaImage‘).hide().attr(‘src‘, ‘../kaptcha/getKaptchaImage?‘ + Math.floor(Math.random()*100) ).fadeIn();
    event.cancelBubble=true;
}
</script>
</head>
<body>  

<div class="chknumber">
      <form action="../kaptcha/check">
      <label>验证码:
      <input name="kaptcha" type="text" id="kaptcha" maxlength="4" class="chknumber_input" />
            </label>
            <br />
      <img src="../kaptcha/getKaptchaImage" id="kaptchaImage"  style="margin-bottom: -3px"/>
      <a href="#" onclick="changeCode()">看不清?换一张</a>
      <input type="submit" value="提交">
      </form>

</div>
</body>
</html>  

 5. web.xml中别忘了加载这个springmvc.xml文件

  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 配置SESSION超时,单位是分钟 -->
  <session-config>
    <session-timeout>15</session-timeout>
  </session-config>
<!-- Spring和mybatis的配置文件 -->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <!-- 防止Spring内存溢出监听器 -->
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>

6. 启动项目后和效果如下。

7. 项目源码希望大家来探讨。

https://github.com/owenma/kaptcha_demo

如果觉得有疑问或者对你有帮助 欢迎评论。

作者:森林木马

如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意

转载文章之后必须在 文章页面明显位置给出作者和原文连接否则保留追究法律责任的权利。

时间: 2024-10-06 01:19:56

图形验证码实现方案(解决短信轰炸问题)的相关文章

利用网络短信验证码接口实现手机短信轰炸 (历史代码,贴出学习)

//resource.h //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // #define IDD_DLG_PROC 101 #define IDR_BIT1 102 #define IDB_BITMAP1 103 #define IDI_ICON1 104 #define IDC_BTN_SEND 1001 #define IDC_LIST_VIEW 1002 #define IDC_EDIT_PH

短信轰炸的原理及解决思路

大部分的网站和移动应用在注册时使用手机号码作为平台账号,利用短信验证来鉴别手机号是否属于用户本人.因此,我们在各类平台的注册场景经常见到短信验证.然而,这种验证工具背后却暗藏许多安全隐患.其中最主要的一种就是黑产利用各类平台的短信验证接口进行短信轰炸. 短信轰炸造成短信通道阻塞.企业品牌形象受损.短信费用被大量恶意消耗等负面影响,若被用户投诉,还将导致短信接口封禁,直接影响网站正常业务. 什么是短信轰炸? 短信轰炸是通过各平台获取短信验证码,达到恶意发送垃圾短信的工具.这种"短信炸弹"

简析短信轰炸给平台注册场景带来的交互安全威胁

大部分的网站和移动应用在注册时使用手机号码作为平台账号,利用短信验证来鉴别手机号是否属于用户本人.因此,我们在各类平台的注册场景经常见到短信验证.然而,这种验证工具背后却暗藏许多安全隐患.其中最主要的一种就是黑产利用各类平台的短信验证接口进行短信轰炸. 短信轰炸造成短信通道阻塞.企业品牌形象受损.短信费用被大量恶意消耗等负面影响,若被用户投诉,还将导致短信接口封禁,直接影响网站正常业务. 下面将详细给大家介绍短信轰炸的流程以及几种应对方式的分析: 何为短信轰炸 短信轰炸是通过各平台获取短信验证码

短信轰炸工具原理解析

温馨提示:本文文章紧作为学习探讨,不能用于破坏攻击用途,后果自负.文章后面有Demo源码下载,使用C#语言开发. 相信不少人都莫名奇妙收过一些注册验证码短信.登录验证码短信,自己没去注册也没登录,甚至有些人无缘无故收到大量的各种网站的验证码短信.遇到这种情况,要么是有人注册填错了号码,要么就是你得罪了什么人被恶搞报复了,前者的可能性很少,填错号码注册也不会收到大量的短信:后者的情况是别人利用一种叫短信轰炸机的工具轰炸你,这种工具有桌面版的,也有网页版的,功能原理都差不多,输入一个号码,就可以对这

短信轰炸的原理

以前经常有朋友找我问有没有短信轰炸的APP,我想一个做技术的人还是要搞懂短信轰炸的原理的.其实也很简单,一起来学习下. 1.发现一个短信接口没做什么机制的网站,很多小网站都有这个漏洞 2.打开burpsuit,将浏览器网络设置一下,让其流量走burpsuit 3.将抓到的包repeater一下,然后go几次,看看效果 效果真强.. 原文地址:https://www.cnblogs.com/liyanhu/p/9828385.html

手把手教你实现&quot;短信轰炸&quot;

手把手教你实现"短信轰炸" 我这里采用简单易懂的语言--"Python3"来实现   实现前的准备:             1,电脑,谷歌浏览器 2,python3环境 3,chromedrive相应的版本 1 , 当然需要下载python的咯--> Python最新源码,二进制文档,新闻资讯等可以在Python的官网查看到: Python官网:https://www.python.org/你可以在以下链接中下载 Python 的文档,你可以下载 HTML.

发送短信验证码-node+阿里云短信

一.准备工作 前端: 表单 提交方式--- get .post 整体提交 ajax提交 表单验证 正则表达式---不轻易自己写正则,不是不写,一定要考虑好兼容性(全面性)---- 提示信息的选择性 图形验证码 后端进行提供的一张图片,并且这张图片会对应一个字段,这个字段传递给前端,前端负责校验即可 短信验证码 判断是不是手机号 如果是,那么就发送此手机号給后端,后端继续进行操作 第三方登录 qq登录,微信登录,微博登录 appid appsecret appkey 后端: get url.par

【C/C++】如何获取短信验证码---创蓝253短信服务平台

#include <arpa/inet.h>#include <assert.h>#include <errno.h>#include <netinet/in.h>#include <signal.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/socke

【转】前端验证码倒计时、后台发送验证码、创蓝短信接口

前端代码:倒计时 <!DOCTYPE html><html><head lang="en">    <meta charset="UTF-8">    <title></title> <style>        .yanzm_b_btn {            width: 98px;            height: 40px;            float: left