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);

  

posted @   bonelee  阅读(305)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用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,插入数据文件不断增长(快照),再通过删除老数据做更新
点击右上角即可分享
微信分享提示