2009-06-26 2 views
0

친구를위한 사이트를 조금 만들고 있습니다. noobfriendly이므로 쉽게 페이지를 추가 할 수 있습니다. 저는 index.php에 모든 것을 포함시킬 것입니다. 그래서 그녀는 단지 /pages/이라는 폴더에 페이지를 드롭 할 수 있습니다.

index.php를

if (preg_match('/[a-zA-Z]/', $_GET['page'])){ 
$page = 'pages/'.$_GET['page'].'.php'; 

if ($page) { 
include $page; 
} else { 
exit; 
} 

} else { 
include('pages/home.php'); 
} 

이 꽤 안전 권리인가? 나는 문자들 a-z 만 허용하고있다. Google과 같은 큰 사이트가 될 수 없다는 의미입니다. 글쎄, 난 단지 취미 코더 일 뿐이야. 남자들에게 확실히 물어볼거야.

당신은 어떻게 생각하십니까?

+0

정규 표현식은 적어도 하나의 char이 [a-zA-Z]이고 다른 모든 문자는 무시한다는 것을 확인합니다 – Cheekysoft

답변

1

아니요 /../../../ 또한 정규 표현식

사용 '/^[a-zA-Z]+$/'

이전에 아무것도 허용되는 문자의 순서 후에 없다 있는지 확인이 방법을 일치합니다.

3

당신은 this.

ctype_alnum($_GET["page"]); 
2

이 확보하려면 정규식 /^[a-z]+$/i 있는지 확인 사용할 수 있습니다. 이렇게하면 전체 문자열 (^은 시작이고 $는 끝임)이 알파벳순인지 만 확인됩니다. 그러면 작업이 안전해질 것입니다 (적어도이 부분에서).

1

입력하기 전에 일부 입력을 검사하는 것이 좋습니다. 우선, 포함하기 전에 is_file ($ filename)을 수행 할 수 있습니다.

다른 하나는 정규식이 한 문자 만 허용하도록 설정 되었기 때문에 원하는 것은 아닐 수도 있습니다. 또 다른 한가지 : 앞의 포스터에서 언급했듯이, 정규 표현식은 입력이 정상적으로 보이는지 여부 만 검사합니다. 그 후에는 _GET 변수를 사용합니다. 위의 문제를 피하기 위해 preg_match (결과를 배열에 할당 할 수 있음)의 결과를 사용해야합니다.

감사

0
preg_match('/[a-zA-Z]/', $_GET['page'], $match) 

if ($match) { 
    $page = "pages/$match.php"; 
    if(file_exists($page){ 
     include $page; 
    } else { 
     include "pages/404.php"; 
    } 
} else { 
    include "pages/home.php"; 
} 

어쩌면 가짜 은? 'page''blabla89349'으로 설정된 경우 'blabla.php' 페이지가 포함됩니다. 그것이 당신이 의도 한 것이라면 나는 확실하지 않습니다. 그렇지 않으면 당신은 그것에 대해 엄격한 될 수 및

if ($match == $_GET['page']) { 
... 
1

정말 경로에 문자열을 편집, 당신이 악용 될 수있는 브라우저와 파일 시스템의 단점 모를 등록을 좋아하지 않는다. 실제로해야 할 일은 실제로 입력을 사용하는 것이 아니라 유효한 파일 이름을 검사하는 것입니다.

glob 또는 scandir을 사용하여 pages 디렉토리에있는 파일 목록을 가져온 다음 in_array를 사용하여 요청한 문자열이 파일인지 확인하십시오. 경로 요소를 제거하려고하면 실수를 저 지르지 않게됩니다.