I have a public folder pub
with subfolders and files in it. A user gives me now a relative filepath, I perform some mappings, and I read the file with fstream
and return it to the user.
The problem is now if the user gives me a path like e.g. ../fileXY.txt
or some other fancy stuff considering path traversal or other types of filepath injection. fstream
is just gonna accept it and read potential files outside of my public pub
folder or even worse give them a list of all files on my system etc... .
Before reinventing the wheel, I searched in the filesystem library and I have seen there is this std::filesystem::canonical function and there is quite a talk about the normal form. I have a general question here, can this function and the variant std::filesystem::weakly_canonical be used to prevent this types of vulnerabilities? So basically is it enough?
Further, my system's filesystem library is still in experimental mode and the std::filesystem::weakly_canonical
is missing. But I cannot use the canonical
because the files must exist in canonical
. In my case I have certain mappings and the files dont exist in that sense. So I would need to mimic the weakly_canonical
function, but how?
I have seen a related stackoverflow question on realpath for nonexisting paths and he was suggested to repeat the canonical as long as the path exist and then to add the nonexisting part to it, but that is again vulnerable to these type of injections. So do I have to roll my own weakly_canonical
or can I somehow mimic it by combining some std::experimental::filesystem
functions?
std::filesystem::canonical
would prevent these security issues. – Febrific