🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ![](https://img.kancloud.cn/ff/c0/ffc049138ef79328c4c61f3c4885870f_426x229.gif) ## 文献:GBT 38674-2020信息安全技术 应用软件安全编程指南 ![](https://img.kancloud.cn/28/5c/285cab0556eb6108d06583d4ba0d3b19_916x598.png) ## 问题01:什么是CAPTCHA? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(**全自动区分计算机和人类的图灵测试**)的缩写,是一种区分用户是计算机还是人的公共全自动程序。**可以防止:恶意破解密码、刷票、论坛灌水**,有效防止某个黑客对某一个特定注册用户用特定程序**暴力破解**方式进行不断的登录尝试。 1. 一种有效防止机器人及恶意用户滥用网站或服务; 2. 防止恶意破解密码、刷票、论坛灌水、刷页; 3. 防止黑客暴力破解。 ## 问题02:尝试编写批量注册账号的恶意脚本。 1. 不断写入数据:计时器 2. 异步请求:Ajax ## 问题03:验证码图像的src如何处理?如何点击刷新? * [ ] 视图请求控制器,控制器请求模型,模型提供图像,控制器返回图像 * [ ] 点击更新验证码需要防止缓存(时间戳) ``` $("#code").attr("src","CreateImage?time="+new Date().getTime()); ``` ## 问题04:如何设置Servlet响应的内容是图像? ``` response.setContentType("image/jpeg");//设置响应类型 ``` ## 问题05:如何创建图像工具类?需要哪些成员? * [ ] 1. 验证码图像--->提供给视图 * [ ] 2. 验证码内容--->提供给登录/注册 ## 问题06:如何创建图像? ``` BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); ``` ## 问题07:使用安全的随机算法。 ![](https://img.kancloud.cn/fe/b6/feb651c25c792f5eb987f64a099ded7a_989x315.png) ``` Random random = new SecureRandom(); ``` ## 问题08:实现对验证码进行干扰。 ![](https://img.kancloud.cn/4e/80/4e80fbe0683421d133adca6981ccb36c_174x73.png) ``` for (int i = 0; i < 10; i++) { int x1 = random.nextInt(width/2); int y1 = random.nextInt(height); int x2 = random.nextInt(width/2)+width/2; int y2 = random.nextInt(height); g.drawLine(x1, y1, x2, y2); } ``` ## 问题09:Servlet如何输入图像? ``` ImageIO.write(image, "jpeg", response.getOutputStream());//输出图像 ``` ## 问题10:中文在计算机中是如何表示的? **GB2312编码范围:A1A1-FEFE,其中汉字编码范围:B0A1-F7FE。** GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。 **16-55区(B0-D7区:176-215,A1-FE位:161-254)收录3755个一级汉字,按拼音排序。** ![](https://img.kancloud.cn/76/b7/76b747bb12369227d9d8d631fdb4c53e_1429x293.png) 56-87区收录3008个二级汉字,按部首/笔画排序。 ### 汉字的表示 **双字节编码** GB2312规定对收录的每个字符采用两个字节表示,**第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位**。 ## 问题11:如何随机一个汉字? * [ ] 步骤1:一级汉字3755个,随机生成一个数字,然后按照**每个区94个**字符进行整除或取余 * [ ] 步骤2:将起始区位码转为10进制,并加入到随机值中 * [ ] 步骤3:将处理之后的10进制区位码分别转为高低两个字节 * [ ] 步骤4:将字节数组按照编码构造为String ![](https://img.kancloud.cn/57/c3/57c3444692afffa79c042506f2960963_1116x263.png) ## 问题12:增加对验证码的判断(忽略大小写)。 ``` codes.equalsIgnoreCase(captcha) ```