나는 내가 신뢰할 수있는 rootPath
이고 그렇지 않다면 relativePath
입니다. 나는 그 결과가 rootPath
아래인지 확신 할 수있는 방법으로 그들을 결합하기를 원하며 사용자는 ..
을 사용하여 시작 지점을 지나갈 수 없다. 당신이 할 수있는 world
Path.Combine의 안전한 버전
2
A
답변
5
확장하려면 : 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");
}
-1
2
당신은 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의 의견을 참조하십시오.
관련 문제
- 1. 안전한 버전 관리
- 2. 위키 스타일의 독립 실행 형 버전 관리 - 안전한 "설명서 패키지
- 3. 안전한 로그인하기
- 4. 안전한 MIME을 사용하는 안전한 메시징은 신뢰할 수 있습니까?
- 5. 배열 액세스의 안전한 요소
- 6. 안전한 ODBC 연결 - 모순?
- 7. 안전한 데이터 전송
- 8. nHibernate 안전한 삭제
- 9. javascript_include_tag 안전한 HTML 출력
- 10. 안전한 연결로 django.core.mail send_email
- 11. codeigniter의 안전한 인증
- 12. 안전한 캔버스 명확화
- 13. 안전한 단일 mvc 페이지
- 14. ARM은보다 안전한 명령어 세트입니까?
- 15. PHP : 안전한 사용자 인증?
- 16. HttpURLConnection의 안전한 사용
- 17. 안전한 자바 스크립트 템플릿
- 18. 안전한 Google 인증
- 19. 좋은, 안전한 암호화
- 20. C# : 스레드로부터 안전한 이벤트
- 21. Delphi에서 OutputDebugString은 안전한 스레드입니까?
- 22. 유형 안전한 프로그래밍 언어 ..?
- 23. 공유의 DataContext는 안전한 방법
- 24. 안전한 방법으로 memcpy 바꾸기
- 25. 안전한 파일 삭제
- 26. 안전한 토큰 프로세스
- 27. jQuery 안전한 양식
- 28. 3G는 안전한 연결입니까?
- 29. 코드를 저장할 안전한 장소
- 30. 소스 안전한 분기 차이
유지하기 위해 필요로 끝낼 생각 한 과학적 \ 누가 \ \ 간다 : \ 루트 \로 끝나지 않는 경우에, 그러나 D – BCS
을, 그건 여전히 제한된 트릭을 재생할 수 있습니다. 다른 디렉토리에서 끝나면, 루트 디렉토리의 형제가됩니다.이 디렉토리는 접두어로 시작합니다. 예를 들어 루트는 \ zip \ zop, 상대 경로 .. \ zopper \ zup 일 수 있습니다. \ zip \ zop \ zup에 있지만 \ StartupWith 테스트를 여전히 만족하는 트리 외부에서는 \ zip \ zopper \ zup으로 끝납니다. 위험은 작지만 0은 아닙니다. –
멋진 코너 케이스 ... 코드에 추가 할 것입니다. –