我有一个pub包含子文件夹和文件的公用文件夹。现在,用户给了我一个相对的文件路径,执行了一些映射,然后读取了文件fstream并将其返回给用户。
现在的问题是,如果用户../fileXY.txt考虑路径遍历或其他类型的文件路径注入,给我一个路径,例如或其他一些奇特的东西。fstream只会接受它并读取我的pub公用文件夹之外的潜在文件,甚至更糟的是给它们列出我系统中所有文件的列表,等等。
在重新发明轮子之前,我在文件系统库中进行了搜索,我发现这里有std :: filesystem :: canonical函数,并且已经有很多关于正常形式的讨论。我在这里有一个一般性的问题,可以使用此功能和变体std :: filesystem :: weakly_canonical来防止此类漏洞吗?那么基本上就足够了吗?
此外,我系统的文件系统库仍处于实验模式,并且std::filesystem::weakly_canonical缺少该文件系统。但是我不能使用,canonical因为文件必须存在于中canonical。就我而言,我具有某些映射,并且文件在这种意义上不存在。因此,我需要模仿该weakly_canonical功能,但是如何?
我已经在realpath上看到了有关不存在的路径的一个stackoverflow问题,建议他在路径存在的情况下重复规范,然后向其中添加不存在的部分,但这又容易受到这类注入的影响。那么我必须自己滚动weakly_canonical还是可以通过组合某些std::experimental::filesystem功能以某种方式模仿它?
我已经读过好几次了(例如,这里的编译器:如果条件始终为true / false怎么办),任何像样的c ++编译器都会选择退出
if(false)
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,如果有意跳入此if(false)障碍该怎么办。我有这样的想法
#include <iostream>
void func(int part){
switch (part) {
case 0:{
if(false)
case 1:{std::cout << "hello" << std::endl;}
break;
}
default:
break;
}
}
int main()
{
func(0);
func(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何体面的C ++编译器会尊重这种跳跃,还是最终会在退出时出现一些问题?