2013-04-17 1 views
0

쿼리 문자열에서 가져온 폴더와 파일 이름의 파일을 포함시키는 가장 좋은 방법은 무엇입니까?PHP는 쿼리 문자열의 변수 파일을 포함합니다.

myServer.com/data 각 파일에는 수백 개의 폴더가 있습니다. 일반 html 파일입니다. 내에서 소스 파일을 읽을 수있는 PHP는 무엇

http://www.myServer.com/code/targetPage.php?folder=folder132&name=file23 

: myServer.com/code에서

내가이 같은 URL을 구축 할 수있는 PHP를 targetPage.php

입니다 소스 폴더에 저장하고 대상 페이지의 "targetDiv"의 innerHTML으로 소스 "div"의 내용을 포함 하시겠습니까?

<body><div id="targetDiv">This is the place holde div</div> 

저는 PHP에 익숙하지 않습니다. 그러므로 질문입니다.

+2

이 작업을 수행하지 마십시오.이 스크립트는 큰 보안 문제를 일으 킵니다. –

+1

'folder' 매개 변수는 항상 단일 이름입니까, 아니면 디렉토리 구분 기호를 가질 수 있습니까? –

+1

공격자는 mime 유형 및 확장명을 변경하지 않고도 모든 파일 유형에 PHP 스크립트를 추가 할 수 있습니다. 그는 그것을 실행할 수 있습니다. 이 링크를 확인하십시오 http://security.stackexchange.com/questions/32967/is-it-possible-to-execute-a-php-script-in-an-image-file –

답변

1

먼저 에 포함 된 파일이 허용되는 것이 바람직하며 whitelist을 사용하십시오.

그런 다음 file_get_contents()과 같은 함수를 사용하여 파일을 문자열로 읽어서 echo과 함께 출력 할 수 있습니다.

가 마무리 (이 그것을 할 수있는 방법이고, 다른 방법이 존재) :

$file = $_GET['folder']."/".$_GET['file']; 

if (in_array($file, $whitelist)) { 
    $contents = file_get_contents($file); 
} else { 
    $contents = "Not allowed"; 
} 

echo "<body><div id='targetDiv'>$contents</div>" 

당신은 예를 들어 당신이 보여줄 수 있기를 원하는 디렉토리를 스캔하여 화이트리스트를 생성 할 수 있습니다. (이것은이 답변의 범위를 벗어납니다 ;-)).

또 다른 해결책은 정규 경로 결과를 realpath()으로 확인할 수 있습니다.

+0

나는이 작업을 일정 수준의 보안으로 수행하는 것은 불가능하다고 말하지는 않지만, 이미 구축 된 구조 내에서 같은 일을 수행 할 방법이 있다고 생각한다. 요청한 파일에 매핑 한 후 방문자에게 완전히 노출되지 않은 PHP 코드를 적절한 파일 참조로 변환합니다. – Craig

+0

@Craig - 감사, 월요일 오전 :-) –

+0

@Craig 동의하지만 포스터에는 수백 개의 폴더가 있으며 다른 프로그램에서 생성 된 파일이 여러 개 있습니다. ID를 생성한다는 것은 다른 작업, 더 많은 코드, 따라서 더 많은 버그가 있음을 의미합니다. 내가 제안하는 것은 기본적으로 폴더와 파일 이름을 ID로 사용하여 파일에 매핑하는 것입니다. –

1

이것은 잠재적 인 해커에게 기본적으로 초대되는 것으로 의심 할 여지없이 PHP 페이지에 포함 (및 실행) 할 파일을 쉽게 지정할 수있는 능력을 부여하는 것입니다.

처음에는 홍수가 발생하여 SQL 인젝션 공격을 유발하는 문제와 유사합니다. 쿼리 문자열에서 포함 파일로 경로를 가져 가고 싶습니까? 쿼리 문자열은 최종 사용자에게 공개됩니다. 내가 보는 한 가지 문제점은 사이트의 내부 구조를 방문자에게 노출시키는 경향이 있다는 것입니다. 또 다른 문제는 방문자가 어떤 방식 으로든 사이트를 해독하거나 (최악의 경우) 보안을 손상시키고 더 큰 접근을 제공 할 때까지 다른 포함 파일을 실험 할 수 있다는 것입니다. 귀하의 서버 또는 귀하의 데이터베이스에, 그러면 완전히 손상 될 때까지 나를 더 깊게 파고 들게하거나 데이터베이스에서 삭제하거나 데이터베이스에있는 것들을 업데이트 할 수 있습니다. "나"와 "나"는 물론, 나는 당신의 사이트를 해킹하려는 누군가를 의미한다고 가정한다.

내가 포함시킬 파일을 찾는 다른 방법 (방문자에게 노출되지 않은 서버 측)을 찾는 방법을 탐색 할 것입니다.

+1

SQL없이 SQL 인젝션을 어떻게합니까? –

+0

글쎄,이 경우에는 PHP 주입이 될 것입니까? 그래도 같은 기본 개념. :-) – Craig

+0

나는 쿼리 문자열이 명확하지 않기 때문에 위험하다고 생각하지 않는다 : 명시 적 경로가 아닌 "? paramA = 123? paramB = 12"와 같은 것을 포함 할 것이다. "123"을 사용하면 폴더 경로와 paramB 파일 이름을 설정합니다. –

0

폴더가 디렉터리 분리 기호없이 이름 만 있으면 basename()을 사용하여 폴더와 이름에서 구분 기호를 제거 할 수 있습니다. ..은 기술적으로 유효하지만 기본 디렉토리 외부로 나가는 것을 허용하지 않기 때문에 폴더는 특별한 처리가 필요합니다.

if (isset($_GET['folder'], $_GET['name'])) { 
    $folder = trim(basename($_GET['folder']), '.') ?: '.'; 
    $name = basename($_GET['name']); 

    $file = BASE_DIR . "/$folder/$name"; 
    if (is_file($file) && is_readable($file)) { 
     echo file_get_contents($file); 
    } 
} 

BASE_DIR는 파일을로드에서 기본 디렉토리를 포함하는 일정한 될 것이다.

+0

PHP에는 실제 경로를 제공하는'realpath' 함수가 있습니다. 점들과 모두는 없습니다. –

+0

@BartFriederichs 네, 그렇긴하지만'../../../../ etc/passwd'의 절대 경로를 제공 할 것입니다. 즉 안전하지 않을 것입니다. –

+0

아니요,'realpath ('../../../../ etc/passwd')'는/etc/passwd "'입니다. –

관련 문제