Pendaftaran-log masuk-pengubahsuaian kata laluan secara amnya memerlukan penghantaran kod pengesahan, tetapi ia mudah untuk diserang dan dipindahkan secara berniat jahat⽤
Apakah SMS -Pengebom E-mel
Pengebom SMS ialah kaedah menghantar kod pengesahan pendaftaran SMS tanpa had untuk pelbagai tapak web ke telefon mudah alih dalam kelompok dan kitaran.
Kerugian yang diakibatkan oleh syarikat
Mesej teks berharga 5 sen Jika ia dileret oleh pencuri, semua orang akan mengira pemberitahuan e-mel secara percuma. Penipuan berskala besar, lebar jalur, sambungan, dll. diduduki, menjadikannya mustahil untuk digunakan seperti biasa
Cara menghalang tapak web anda daripada menjadi "pedaging" atau disikat
Tambahkan kod pengesahan grafik (pembangun)
Hadkan bilangan permintaan IP tunggal (pembangun)
Hadkan penghantaran nombor (biasanya disediakan melalui SMS) Dewan Perniagaan)
Selalu ada serangan dan pertahanan, tetapi ia hanya meningkatkan kos penyerang, dan ROI tidak berbaloi itu, jadi kami berputus asa
Alat penjanaan kod pengesahan yang sangat boleh dikonfigurasikan dan praktikal yang disumberkan oleh Google
Fon/saiz/warna kod pengesahan
Julat kandungan kod pengesahan (nombor, huruf, aksara Cina!)
Saiz, jidar, ketebalan jidar dan warna jidar imej kod pengesahan
Gaya kod pengesahan (gaya mata ikan, 3D, kabur biasa)
Tambah pergantungan
<!--kaptcha依赖包--> <dependency> <groupId>com.baomidou</groupId> <artifactId>kaptcha-spring-bootstarter</artifactId> <version>1.0.0</version> </dependency>
Kelas konfigurasi
/** * 图像验证码的配置文件 * @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; } }
Kelas konfigurasi saya
Kelas alat untuk mendapatkan IP akses dan menjana 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; }
Pembangunan antara muka
@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; }
Profil
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
Hasil
Atas ialah kandungan terperinci Cara menggunakan Springboot +redis+Kaptcha untuk melaksanakan fungsi kod pengesahan imej. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!