註冊-登入-修改密碼一般需要發送驗證碼,但是容易被攻擊惡意調⽤
什麼是簡訊-郵箱轟炸機
手機簡訊轟炸機是批次、循環給手機無限發送各種網站的註冊驗證碼簡訊的方法。
公司帶來的損失
簡訊1筆5分錢,如果被大盜刷大家自己計算郵箱通知不用錢,但被大盜刷,頻寬、連線等都被佔用,導致無法正常使用
如何避免自己的網站成為」肉雞「或被刷呢
增加圖形驗證碼(開發人員)
單IP請求次數限制(開發人員)
限制號碼發送(一般簡訊提供商會做)
攻防永遠是有的,只過加大了攻擊者的成本,ROI劃不過來⾃然就放棄了
Google開源的一個可高度配置的實用驗證碼產生工具
驗證碼的字體/大小/顏色
驗證碼內容的範圍(數字,字母,中文漢字!)
#驗證碼圖⽚的大小,邊框,邊框粗細,邊框顏色
#驗證碼的⼲擾線驗證碼的樣式(魚眼樣式、3D、普通模糊)
新增依賴
<!--kaptcha依赖包--> <dependency> <groupId>com.baomidou</groupId> <artifactId>kaptcha-spring-bootstarter</artifactId> <version>1.0.0</version> </dependency>
配置類別
/** * 图像验证码的配置文件 * @author : look-word * @date : 2022-01-28 17:10 **/ @Configuration public class CaptchaConfig { /** * 验证码配置 * Kaptcha配置类名 * * @return */ @Bean @Qualifier("captchaProducer") public DefaultKaptcha kaptcha() { DefaultKaptcha kaptcha = new DefaultKaptcha(); Properties properties = new Properties(); //验证码个数 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); //字体间隔 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE,"8"); //⼲扰线颜⾊ //⼲扰实现类 properties.setProperty(Constants.KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); //图⽚样式 properties.setProperty(Constants.KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.WaterRipple"); //⽂字来源 properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING, "0123456789"); Config config = new Config(properties); kaptcha.setConfig(config); return kaptcha; } }
我的設定類別
取得存取ip與產生MD5的工具類別
public class CommonUtil { /** * 获取ip * @param request * @return */ public static String getIpAddr(HttpServletRequest request) { String ipAddress = null; try { ipAddress = request.getHeader("xforwarded-for"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("Proxy-Client-IP"); } request.getHeader("WL-Proxy-Client-IP"); request.getRemoteAddr(); if (ipAddress.equals("127.0.0.1")) { // 根据⽹卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ipAddress = inet.getHostAddress(); } // 对于通过多个代理的情况,第⼀个IP为客户端真实IP,多个IP按照','分割 if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length() // = 15 if (ipAddress.indexOf(",") > 0) { ipAddress.substring(0, ipAddress.indexOf(",")); } catch (Exception e) { ipAddress=""; } return ipAddress; } public static String MD5(String data) { java.security.MessageDigest md = MessageDigest.getInstance("MD5"); byte[] array = md.digest(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); return sb.toString().toUpperCase(); } catch (Exception exception) { return null; }
介面開發
@RestController @RequestMapping("/api/v1/captcha") public class CaptchaController { @Autowired private StringRedisTemplate stringRedisTemplate; private Producer producer; @RequestMapping("get_captcha") public void getCaptcha(HttpServletRequest request, HttpServletResponse response){ String captchaText = producer.createText(); String key = getCaptchaKey(request); // 十分钟过期 stringRedisTemplate.opsForValue().set(key,captchaText,10, TimeUnit.MINUTES); BufferedImage image = producer.createImage(captchaText); ServletOutputStream outputStream=null; try { outputStream= response.getOutputStream(); ImageIO.write(image,"jpg",outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 生成redis验证码模块的key * @param request * @return */ private String getCaptchaKey(HttpServletRequest request){ String ipAddr = CommonUtil.getIpAddr(request); // 请求头 String userAgent=request.getHeader("user-Agent"); String key="user_service:captcha:"+CommonUtil.MD5(ipAddr+userAgent); return key; }
設定檔
server: port: 8080 spring: redis: host: redis锁在的ip password: redis的密码 port: 端口号 lettuce: pool: # 连接池最⼤连接数(使⽤负值表示没有限制) max-idle: 10 # 连接池中的最⼤空闲连接 max-active: 10 # 连接池中的最⼩空闲连接 min-idle: 0 # 连接池最⼤阻塞等待时间(使⽤负值表示没有限制) max-wait: -1ms
結果
#以上是怎麼用Springboot +redis+Kaptcha實現圖片驗證碼功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!