C代码规范:使用文件路径前必须进行规范化并校验,fwrite写入文件前,要设置文件权限
使用文件路径前必须进行规范化并校验
文件路径来自外部数据时,必须对其做合法性校验,如果不校验,可能造成系统文件的被任意访问。 但是禁止直接对其进行校验,正确做法是在校验之前必须对其进行路径规范化处理。这是因为同一个文 件可以通过多种形式的路径来描述和引用,例如既可以是绝对路径,也可以是相对路径;而且路径名、 目录名和文件名可能包含使校验变得困难和不准确的字符(如:“.”、“..”)。
所以下面才是正确的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdlib.h> #include <stdio.h> #include <limits.h> int main() { const char *relative_path = "./test.txt" ; char absolute_path[PATH_MAX]; if (realpath(relative_path, absolute_path) == NULL) { // 先用这个 perror ( "Error resolving absolute path" ); return EXIT_FAILURE; } FILE *file = fopen (absolute_path, "r" ); if (file == NULL) { perror ( "Error opening file" ); return EXIT_FAILURE; } // Use the file... fclose (file); return EXIT_SUCCESS; } |
否则会有:In fopen: It should canonical file path before use it, path arg is filename
此外,fwrite写入文件前(第一次),要设置文件权限:should set permission of file handle "file" before use it
如下是正确的代码 示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <fcntl.h> #include <unistd.h> #include <stdio.h> int fd = open(filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); // 创建文件权限 if (fd == -1) { // Handle error } FILE *file = fdopen(fd, "wb" ); // 然后再打开写入 if (file == NULL) { // Handle error } // Use fwrite with the FILE * size_t result = fwrite (data, sizeof (data[0]), count, file); if (result != count) { // Handle error } fclose (file); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-12-21 RCNN 目标识别基本原理
2018-12-21 01二维矩阵中最大全为1的正方形maxSquare——经典DP问题(二维)
2017-12-21 利用机器学习进行DNS隐蔽通道检测——数据收集,利用iodine进行DNS隐蔽通道样本收集
2017-12-21 dns tunnel工具地址
2016-12-21 445. Add Two Numbers II ——while s1 or s2 or carry 题目再简单也要些测试用例
2016-12-21 22. Generate Parentheses——本质:树,DFS求解可能的path
2016-12-21 LevelDb简单介绍和原理——本质:类似nedb,插入数据文件不断增长(快照),再通过删除老数据做更新