Path.comBine의 안전한 버전
-
03-07-2019 - |
문제
나는있다 rootPath
내가 신뢰하는 것과 a relativePath
내가하지 않는다는 것. 결과가 아래에 있는지 확인할 수있는 방식으로 결합하고 싶습니다. rootPath
그리고 사용자는 사용할 수 없습니다 ..
출발점을 지나서 돌아갑니다. 나 하다 다음과 같은 것을 허용하기 위해 상대적인 경로를 원합니다. hello\..\world
== world
해결책
확장하려면 : Path.comBine을 사용한 다음 결과에 GetFullPath를 호출하고 해당 결과가 RootPath로 시작하는지 확인하십시오.
하드 링크로부터 보호하지는 않지만 더블 도트와 같은 간단한 것들을 포착해야합니다.
위의 코드 : 코드 :
string Resolve(string fileName)
{
string root = FileRoot();
string ret = Path.GetFullPath(Path.Combine(root, fileName));
if (ret.StartsWith(root.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar)) return ret;
throw new ArgumentException("path resolved to out of accesable directroy");
}
다른 팁
당신은 그냥 전화 할 수 있습니다 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);
}
첫 번째 테스트에 대한 설명은 Technophile의 답변에 대한 Alex Martelli의 의견을 참조하십시오.
당신이 할 수있는 한 가지는 백 슬래시 수를 세는 것입니다.\
) 및 이중 점 (..
), 이중 점의 수가 백 슬래시 수보다 적은지 확인하십시오. 위로 가기 위해 rootPath
폴더 구조에서는 최소한 이중 점만큼 많은 백 슬래시가 필요합니다. 따라서 허용하는 경우 relativePath
적어도 하나 이상의 백 슬래시가 있으면 안전해야합니다.
제휴하지 않습니다 StackOverflow