2010-02-08 6 views
0

링크에 ".php"파일 확장명을 지정하고 싶지 않습니다. 하지만 그렇게하면 링크에 지정된 파일이 있는지 여부를 확인할 수 없습니다. 이것은 PHP의 "file_exists"함수에 내장되어 있기 때문에 .php 확장자를 고려하기 때문입니다. 그리고 이것조차도 작동하지 않습니다 :PHP에 확장명이없는 파일이 있는지 확인하는 방법은 무엇입니까?

file_exists ($ file. ". php"); 가리키며 .php 확장자를 지정하는 것을 방지하기

<a href="?file=dude">Some File</a> 

<?php 

$file = $_GET['file']; 

if(file_exists($file.".php")) 
{ 
    include($file.".php"); 
} 
else 
    include("404.php"); 


?> 
+1

은 "$의 file.php을"가정이의 include_path에서 사용할 수 또는 실행중인 스크립트와 같은 디렉토리에 존재하는 코드가 작동합니다. – Kevin

답변

0

사용 PHP의 글로브 기능 :

어쨌든, HTML 링크에서 PHP 확장을 speciding하지 않고 다음과 같은 일을 할 수있는 방법이있다. 그러나 이것은 보안 문제가 발생할 수 있습니다 :

http://ar2.php.net/glob

glob($file . ".*") 
0

는, URL 재 작성과 시도 당신의 .htaccess 파일에 다음을 추가

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^/(([^/]+/)*[^.]+)$ /$1.php [L] 
4

귀하의 예는 잘 작동합니다 (I 파일이 현재 작업 디렉토리에있는 경우 EDIT 2에 따라 이전 파일을 다시 읽지 않습니다.이 파일을 cwd로 줄임).


죄송 편집, 내가 무엇을 생각했다. file_exists()에 파일의 전체 경로가 제공되어야하므로 예제가 제대로 작동하지 않습니다. 따라서 디렉토리에서 파일을 가져 오려는 디렉토리 앞에 파일을 추가하십시오. 그럼에도 불구하고 sanatizing과 whitelisting에 대한 나의 경고 등은 여전히 ​​중요합니다.
최종 편집

편집 2
와우, 미안 해요, 내가 엉망있어 일류. file_exists()은 상대 경로로 잘 작동합니다. Looking at the documentation 그러나 안전 모드 제한에 대해 경고합니다. 어쩌면 이것들이 당신의 상황에 적용될 지 모르겠습니다.
당신은 getcwd()와 CWD가 무엇인지 테스트 할 수 있습니다 2

END 편집. 정상적인 상황에서 cwd는 응용 프로그램의 진입 점과 같습니다. 따라서 예를 들어 /usr/www/your_site_root/index.php이 엔트리 포인트 인 경우 /usr/www/your_site_root/이 cwd입니다.

예를 들어 포함시키려는 파일은이 디렉토리에 있어야합니다.

조언의 말 :
당신은 이미 알고 있을지도 모르지만 당신의 예는 안전하지 않습니다. 어떤 식 으로든 사용자의 입력을 위생하지 않습니다 (이 경우 $_GET[ 'file' ]). 이 방법은 방문자가 원하지 않는 결과를 가진 모든 종류의 PHP 파일을 포함 할 수 있습니다.

그래서 가져올 수있는 파일의 화이트리스트를 유지하도록 조언했습니다.같은 뭔가 :

<?php 

$whiteList = array(
    'dude', 
    'chick', 
    'mom' 
); 

// and just to be safe, you should probably strip stuff like ../ etc. here too. 
$requestedFileBaseName = $_GET[ 'file' ]; 

if(!in_array($requestedFileBaseName, $whileList)) 
{ 
    include('404.php'); 
} 
else 
{ 
    include($requestedFileBaseName . '.php'); 
} 
+0

+1 여기에 보안 문제가 있습니다. – ceejayoz

+1

정말입니까? 방금 file_exists()를 로컬에서 테스트했으며 전체 경로없이 작동합니다. – Kevin

+1

@ 케빈 : 예, 미안 해요. 나는 그것을 스스로 테스트했고 실제로 작동한다. 어쨌든 그것을 지적 주셔서 감사합니다. –

0

사용 :

$file = dirname(__FILE__).'/../relativepathfromcurrentscript/'.$_GET['file'].'.php'; 
관련 문제