4.5 测试验证
4.5.1 基础功能测试
测试项 测试URL 预期结果
学生列表 http://localhost/cgi-bin/student.cgi?action=list 显示学生表格
添加学生表单 http://localhost/cgi-bin/student.cgi?action=add 显示添加表单
学生详情 http://localhost/cgi-bin/student.cgi?action=detail&id=1 显示学生信息
班级筛选 http://localhost/cgi-bin/student.cgi?action=list&class_id=1 只显示该班学生
4.5.2 使用curl进行API测试
# 测试列表接口
curl "http://localhost/cgi-bin/student.cgi?action=list&format=json"
# 测试添加学生(POST请求)
curl -X POST \
-d "student_no=2024001&name=测试学生&gender=男&class_id=1" \
"http://localhost/cgi-bin/student.cgi?action=add"
# 测试删除学生
curl "http://localhost/cgi-bin/student.cgi?action=delete&id=1"
4.5.3 常见部署问题及解决方案
问题1:403 Forbidden
# 原因:CGI程序没有执行权限
# 解决方案:
sudo chmod 755 /usr/lib/cgi-bin/student.cgi
sudo chown www-data:www-data /usr/lib/cgi-bin/student.cgi
问题2:502 Bad Gateway
# 原因:CGI程序执行出错
# 解决方案:
# 1. 检查程序是否有语法错误
# 2. 查看Apache错误日志
sudo tail -f /var/log/apache2/error.log
# 3. 手动运行测试
cd /usr/lib/cgi-bin/
./student.cgi
问题3:空白页面
# 原因:程序输出格式不正确
# 解决方案:确保程序首先输出HTTP头
# 正确输出格式:printf("Content-Type: text/html\n\n");
问题4:数据库连接失败
# 原因:数据库配置信息不正确
# 解决方案:
# 1. 测试数据库连接
mysql -u root -p -e "SELECT 1"
# 2. 检查代码中的数据库连接参数
# 3. 查看MySQL错误日志
sudo tail -f /var/log/mysql/error.log
第五部分:项目总结
5.1 项目成果总结
通过本教程,我们成功构建了一个功能完整的C语言Web学生管理系统。以下是项目的核心成果:
5.1.1 已实现的功能
5.1.2 代码统计
5.2 技术难点回顾
5.2.1 CGI编程的核心要点
环境变量解析:通过getenv()获取请求方法、查询字符串等信息
POST数据处理:从stdin读取指定长度的数据
URL解码:将%E5%BC%A0转换为中文字符
HTML转义:防止XSS攻击
HTTP头输出:必须首先输出Content-Type
5.2.2 数据库操作要点
连接管理:使用mysql_init()和mysql_real_connect()
SQL注入防护:使用mysql_real_escape_string()转义
结果集处理:mysql_store_result() + mysql_fetch_row()
错误处理:检查返回值并输出错误信息
5.2.3 前端交互要点
动态表格渲染:JavaScript根据数据生成HTML
模态框表单:弹出层实现添加/编辑
AJAX请求:fetch API实现异步数据传输
JSON数据交换:CGI程序输出JSON格式数据
5.3 性能分析
5.3.1 与主流Web框架的对比
5.3.2 优化建议
使用FastCGI替代传统CGI:FastCGI保持进程常驻,避免每次请求都创建新进程
数据库连接池:复用数据库连接,减少连接开销
静态文件分离:CSS/JS/图片由Web服务器直接处理
输出缓冲:使用缓冲区减少I/O操作
SQL优化:为常用查询字段添加索引
5.4 安全加固建议
5.4.1 防止SQL注入
// 始终使用转义函数
char escaped_name[200];
mysql_real_escape_string(conn, escaped_name, name, strlen(name));
snprintf(sql, sizeof(sql), "INSERT INTO students (name) VALUES ('%s')", escaped_name);
5.4.2 防止XSS攻击
// 输出用户数据时进行HTML转义
char escaped_name[200];
html_escape(name, escaped_name);
printf("<td>%s</td>", escaped_name);
5.4.3 文件权限设置
# CGI程序权限:所有者可读写执行,其他人只可执行
chmod 755 /usr/lib/cgi-bin/student.cgi
# 配置文件权限:仅所有者可读写
chmod 600 config/database.conf
# 日志目录权限:Web服务器可写入
chown www-data:www-data logs/
chmod 755 logs/
5.4.4 输入验证
// 验证学号格式
if (strlen(student_no) != 7 || !isdigit(student_no[0])) {
print_error_page("学号格式错误");
return;
}
// 验证班级ID存在性
if (!is_valid_class_id(conn, class_id)) {
print_error_page("班级不存在");
return;
}
5.5 扩展功能开发指南
5.5.1 添加成绩管理模块
// 成绩管理处理函数
void handle_grade(MYSQL *conn, char *action, char *student_id) {
if (strcmp(action, "add") == 0) {
// 处理添加成绩
char *post_data = get_post_data();
// 解析POST数据...
// 插入scores表
} else if (strcmp(action, "list") == 0) {
// 显示成绩列表
// JOIN students和scores表查询
}
}
5.5.2 添加用户认证模块
// 简单的Session管理(基于文件)
char* create_session(int user_id) {
char session_id[33];
// 生成随机session_id
// 写入文件/tmp/session_[session_id]
return strdup(session_id);
}
int check_session(char *session_id) {
// 检查session文件是否存在且未过期
char path[100];
snprintf(path, sizeof(path), "/tmp/session_%s", session_id);
return access(path, F_OK) == 0;
}
5.5.3 添加分页功能
-- 分页查询SQL
SELECT * FROM students LIMIT offset, limit
// 分页参数解析
int page = atoi(get_param("page", 1));
int limit = atoi(get_param("limit", 10));
int offset = (page - 1) * limit;
// 构建分页SQL
snprintf(sql, sizeof(sql),
"SELECT * FROM students LIMIT %d, %d", offset, limit);
5.5.4 添加搜索功能
// 搜索功能实现
if (strlen(keyword) > 0) {
char escaped_keyword[200];
mysql_real_escape_string(conn, escaped_keyword, keyword, strlen(keyword));
snprintf(sql, sizeof(sql),
"SELECT * FROM students WHERE name LIKE '%%%s%%' OR student_no LIKE '%%%s%%'",
escaped_keyword, escaped_keyword);
}
C语言虽不是Web开发的主流选择,但通过本教程的学习,你将对Web技术的底层原理有更深刻的理解。无论今后使用何种语言开发Web应用,这些基础知识都将使你受益匪浅。
希望本教程能帮助你打开C语言Web开发的大门!
来源:
https://xbivx.cn/