문제

나는있다 rootPath 내가 신뢰하는 것과 a relativePath 내가하지 않는다는 것. 결과가 아래에 있는지 확인할 수있는 방식으로 결합하고 싶습니다. rootPath 그리고 사용자는 사용할 수 없습니다 .. 출발점을 지나서 돌아갑니다. 나 하다 다음과 같은 것을 허용하기 위해 상대적인 경로를 원합니다. hello\..\world == world

도움이 되었습니까?

해결책

system.io.path.getfullpath?

확장하려면 : 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적어도 하나 이상의 백 슬래시가 있으면 안전해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top