2009-06-11 5 views
2

많은 파일 전술을 선택하면
디렉토리가 생깁니다.
트래 버셜 보안 문제가 있습니까?많은 파일 전술에는 디렉토리 통과 보안 문제가 있습니까?

나는,
을 로그인 시스템을 작성해야하고 파일 전술의 많은

이 ID 파일을 많이하고 위해 scandir를 사용하는 것을 의미한다.

그래서 디렉토리가

aaa.txt있을 것
bbb.txt (내용이 aaa_pass입니다) (내용입니다 bbb_pass) 때 사람이 입력
ccc.txt (내용이 ccc_pass가)

와 그의 id,
시스템 scandir 디렉토리
다음 id 파일을 찾으십시오.

하지만 헤이, 그가이

"../../important.txt"로 입력하면?

그는 ../../important.txt에 액세스 할 수 있습니까?

답변

2

처음에는 로그인 시스템을 작성하는 다소 이상한 길을 걷는 것처럼 보입니다. 파일 시스템의 디렉토리에있는 일반 텍스트 파일이 이상한 이유가 아닌 다른 일반적인 이유 때문에 더 일반적인 인증에서 이미 생각해 왔던 많은 미묘한 부분을 간과 할 가능성이있는 경우 현명한 경로라고 확신하지 않습니다. 시스템. 예를 들어 암호 해시되고 소금에 절인 암호를 저장하려는 경우 계획에 암호를 구현하는 방법을 생각해야하며 보안 문제로 이어질 실수를 범할 수 있습니다. 좋은 PEAR 라이브러리 또는 Zend Framework의 Zend_Auth 구성 요소를 사용하면 명확하고 잘 문서화 된 시작점을 얻을 수 있습니다.

어쨌든 질문에 설명하는 이유가 있다고 가정하면이 경우 basename() 함수가 필요할 것입니다. 그것은 당신이 당신의 질문에 묘사하는 것처럼 디렉토리 트래버 설 공격을 할 수 없도록 파일 이름 자체를 제외한 모든 것을 제거 할 것입니다.

사용자로부터 입력이 그래서 경우 :

../../important

당신은 실행할 수 있습니다

$cleanUsername = basename($input); 
$filename  = '/path/to/password/files/' . $cleanUsername . '.txt'; 

if (file_exists($filename)) { 
    [...] 
} 

만들기 감각을?

당신이 경로의 일부로 사용하기 전에 사용자 이름의 일부 유효성 검사를 수행 할 수
+0

아 .... 내가 살균해야합니까? 그리고 그것은 파일 전술의 많은 measn 디렉토리 트래버 싱 보안 문제가 있습니까? –

+0

사용자 입력에 basename()을 호출하면 다른 디렉토리의 파일을 읽을 수 없으므로 위생 정도가 반드시 필요합니다. 사용자 이름이 운영 체제의 파일 이름에 안전 한 문자의 하위 집합을 따르는 한 (알파 - 숫자는 아마도 안전한 내기가 될 것이며, 필요한 경우 밑줄을 포함 할 수도 있습니다), 실제로 필요한 모든 이름이어야합니다. 입력을 받고 basename()을 통해 전달한 다음 파일을 반복하여 일치하는 파일이 있는지 확인합니다. –

1

- 예를 들면에 문자와 숫자 만이 정규 표현식 사용하여이 같은 뭔가를 할 수 있도록 :

if (!preg_match('/^[a-zA-Z0-9]+$/', $username)) { 
    //username is not valid 
} else { 
    //username is ok to use 
} 

또 다른 방법 당신은 예를 들어, 읽기 전에 사용자 이름을 해시하거나 작성하는 것입니다 할 수있는 :

$hash = sha1($username); 

이 방법은, 사용자가 자신의 이름으로 아무것도 수의 동작을 조작하는 이들의 위험이 없을 것이다 파일 조회.사용자 이름이 "../../important.txt" 인 경우 "48fc9e70df592ccde3a0dc969ba159415c62658d"의 해시를 제공 할 수 있습니다. 소스 문자열이 불쾌하지만 안전합니다.

+0

오, 해시 전술이 좋은 것처럼 들리네! –

1

이 파일 - 암호 시스템을 사용하는 것 외에 다른 선택이없는 경우 (어떤 이유로 든해야한다고 가정) 모호한 파일 이름을 만드는 것 외에도 동일하게 파일을 만들 수도 있습니다 다만 경우에 서버 측 언어로 확장 - 당신이 PHP를 사용하는 경우, 예를 들어, 파일 이름은 john.php 수 (또는 '존'난독 화), 및 내용은 다음과 같이있을 것입니다 :

<?php 
    exit; // or maybe even a header redirect -- 
    /*password goes here*/ 
?> 

물론 파일 읽기 루틴은 주석 블록 내에서 구문을 구문 분석해야합니다.

누군가가이 파일에 도착하면 결코 렌더링되지 않습니다.

관련 문제