[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)
```
- 1课程概述
- 2环境配置
- 3MVC
- 3.1View
- 3.1.1前端基础
- 3.1.2JSP语法
- 3.1.3JSP内置对象1
- 3.1.4JSP内置对象2
- 3.2Bean
- 3.3Controller
- 3.3.1Servlet
- 3.3.2Filter
- 3.3.3Listener
- 3.4EL&JSTL
- 4三层架构
- 4.1数据库操作
- 4.1.1JDBC
- 4.1.2JDBC优化
- 4.2三层架构设计
- 4.3程序优化
- 4.3.1数据库连接优化
- 4.3.2数据库操作优化
- 4.4安全专题
- 4.4.1Ajax异步查询
- 4.4.2CAPTCHA
- 4.4.3MD5&SHA
- 4.4.4Cookie
- 4.4.5分页显示
- 4.4.6文件上传
- 4.4.7发送邮件
- 5企业级框架
- 5.0Maven
- 5.1MyBatis
- 5.2Spring
- 5.3SpringMVC
- 6实践项目
- 6.1实验1-用户登录(MVC)
- 6.2实验2-访问统计(Servlet高级)
- 6.3实验3-三层架构
- 6.4实验4-安全信息系统