Вы можете просто позвонить Path.GetFullPath()
и проверить, начинается ли он с вашего доверенного rootPath
. Если вы склонны к паранойе, проверьте также, что rootPath
имеет корни.
public Boolean IsPathSafe(String rootPath, String relativePath)
{
return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
Path.IsPathRooted(rootPath) &&
Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}
Для объяснения первого теста см. Комментарий Алекса Мартелли к ответу технофила.