外部输入的参数不能直接作为文件路径,防止被恶意攻击,比如构造一个跨目录限制的文件路径…/…/…/etc/passwd或…/…/boot.ini,或构造一个指向系统关键文件的链接文件symlink(“/etc/shadow”,“tmp/log”)。PS "./“表示当前目录,可以不写,”…/"表示当前目录的上一级目录,即当前目录的父目录。windows可以用PathCanonicalizeA或者PathCanonicalizeW检查文件目录是否标准,但是微软msdn官网不建议使用PathCanonicalize这个函数,如下图所示:
微软msdn官网说误用PathCanonicalizeA 会导致buffer溢出,建议使用更安全的PathCchCanonicalize或PathCchCanonicalizeEx 代替。
对PathCchCanonicalize函数的使用示例如下:
代码语言:javascript复制#include <Windows.h>
#include <pathcch.h>
#include <string>
#include <iostream>
#pragma comment(lib,"Pathcch.lib")
using namespace std;
//将string转换成wstring
wstring String2WString(string str)
{
wstring result;
//获取缓冲区大小,并申请空间,缓冲区大小按字符计算
int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
TCHAR* buffer = new TCHAR[len 1];
//多字节编码转换成宽字节编码
MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
buffer[len] = '