2010-01-25 2 views
0

나는 전달 된 디렉토리의 모든 파일을 삭제하는 PHP 함수를 작성하고 있습니다 (그리고 결국에는 재귀 적 삭제로 확장 될 수 있습니다). 안전을 위해 버그가 있거나 뭔가를 통해 전달 된 디렉토리가 루트 디렉토리 인 경우 삭제를 시도하지 않도록하고 싶습니다.PHP에서 루트 디렉토리 인식하기

파일 권한은 크게 나를 보호하지만, 단지의 경우, 내가 재귀로 확장 특히 난 그냥 그 여분의 단계로 가겠습니다 삭제해야합니다. 복잡한 요소로

,이 코드는 윈도우 머신 또는 리눅스 머신에서 실행 될 수 있으므로 루트 디렉토리는 'C : \'처럼 보일 수 있습니다 또는 '/'. 나는 실제로 루트뿐만 아니라 아마도 'c : \ temp ..'를 참조하는 다른 방법이 있다고 가정합니다.

그래서 PHP에서 dir spec이 파일의 루트로 해석된다는 것을 인식 할 수있는 확실한 방법이 있습니까? 체계?

정교화 ...

나는 웹 앱 phpunit을 테스트를 쓰고 있어요 내가 테스트가 나중에 실행하고 복원하기 전에 응용 프로그램의 상태를 백업 프레임 워크를 만들려고 해요. 이 앱을 통해 사용자는 파일을 업로드 할 수 있습니다. 파일의 내용에 따라 여러 가능한 디렉토리 중 하나로 복사됩니다. 저장하고 해당 디렉토리 어딘가에 복사해야하는 응용 프로그램의 상태를 복원하려면

는, 테스트 실행, 다음 디렉토리는 파일이 삭제되고 백업에서 입수해온이 필요합니다.

이 디렉토리의 위치는 컴퓨터마다 다를 수 있으며 일부 사람들은 웹 응용 프로그램 외부에 배치한다고 알고 있습니다. 테스트에서 읽을 수있는 구성 파일이 있는데이 파일은 해당 컴퓨터의 디렉터리 위치를 제공합니다.

모든 디렉토리를 특정 디렉토리 트리로 제한하지 않으면 jailing을 수행하기가 어렵습니다. 이 디렉터리를 특정 디렉터리 트리로 제한하면 일부 사람들은 자신의 컴퓨터를 다시 구성해야합니다.

답변

3

절대로 위에 명시된 a.k.a.jailing이라는 루트 폴더가 있어야합니다. 루트 폴더는 심각한 손상을 입힐 수있는 유일한 폴더가 아닙니다.

편집.

난 아직도 투옥의 일종을 사용하여 옹호하지만

, 나는 당신이 어떤 드라이브 문자를 제거 및/\ 변환하여 루트 폴더를 인식 할 수도있을 것 같군요. 루트 폴더는 항상 단일 /입니다.

function isRootFolder($dirpath) { 
    list($drive, $path) = explode(':', str_replace('\\', '/', $dirpath), 2); 

    return $path == '/'; 
} 
+0

나는 이것에 대해 생각하고 나는 그 용어 "옥죄"를 좋아한다. 일부 Windows 시스템에서는 사용자 계정의 디렉토리 인 c : \ users \ ... 및 웹 응용 프로그램의 디렉토리 (c : \ wamp \ www \)를 설명해야한다고 생각하기 때문에 수감이 어려울 수 있습니다. . 아마도 영향을받는 모든 디렉토리가 c : \ wamp \ 아래에 있도록 시스템을 재구성 할 가치가 있습니다. 다른 점은 실수로 모든 파일을 삭제하지 않으려는 다른 디렉토리가 있다고 동의하지만 루트는 유일한 것입니다 하나는 버그가 발생할 가능성이 높다고 생각합니다. –

+0

정확히 무엇을 성취하려고하는지 자세히 설명해 주시겠습니까? 나 또는 다른 누군가가 도움이 될만한 답을 줄 수 있습니다. –

+0

상세히 작성 –

0

보십시오,이 기능 : 그것은 테스트 아니에요

function is_root_dir($path) 
{ 
    $clean_path = realpath($path); 
    if($clean_path == '/' || preg_match('/[a-z]:\\/i', $clean_path)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

, 나는 여기 편집기에서 썼다. c : \ temp .. == c : \

편집 : 마지막으로 nikc가 준 조언을 접어두고 디렉토리 목록을 정의해야합니다. 삭제가 안전합니다.

if (dirname($target)==$target) { // you're at the root dir 

C. (Microsoft 및 다른 모든 것들 사이의 이식) :

관련 문제