2013-03-03 3 views
0

좋아, 그래서 나는 다음을 수행하려고 :

<?php include('pages/{$_GET["page"]}.txt'); ?>

느릅 나무 나던 작품. 그것은 내부의 작업 사이트에 배치되므로 div를 공백으로 남겨 둡니다.

내가 할 경우이 :

작동

<?php include('pages/index.txt'); ?>

.

mydomain.com/?page=index에 연결 중입니다. 누구나 내게 몇 가지 팁을 줄 수 있습니까?

검색을 시도했지만 운이 없었습니다.

+0

문자열을 먼저 분리해야합니다. 당신의 따옴표 사이의 무엇이든은 문자 적으로 취해집니다. – ericosg

+4

아, 그러지 마세요. 이것은 가장 일반적인 취약점 중 하나입니다. 문제는 페이지 매개 변수로 아무 것도 입력 할 수 없으므로 서버에서 액세스 할 수있는 모든 파일을 포함 할 수 있다는 것입니다. –

+0

1 # 나는 그것이 잘못되었다는 것을 깨달았습니다. 나는 너무 혼란 스러웠습니다. # 당신이 말한대로, 당신 말이 맞습니다. 제한/수정 방법이 있습니까? 나는 더 많은 매뉴얼이 될 것이므로 if를 사용하고 싶지 않다. 가능한 한 간단하게 유지하고 싶습니다. –

답변

2

편집 : 많은 분들이이 방법은 안전하지 않은 원하는 일을, 말했다. 여기에 더 나은 만들기 위해 쉬운 방법 :

<?php 
    $valid_pages = array('index', 'contact', 'faq'); 
    $page = $_GET["page"]; 

    if (!in_array($page, $valid_pages)) { 
     $page = $valid_pages[0]; 
    } 

    include("pages/{$page}.txt"); 
?> 

이것은 사용자가 원하는 페이지가 허용 된 페이지 내에있는 경우, 그렇지 않은 경우는 $valid_pages 배열의 첫 번째 하나를 사용합니다 확인합니다.

+0

이것은 내가하려고하는 것을 망치고 있습니다. 폴더에서 유효한 페이지를로드하는 방법이 있습니까? –

+0

예, $ valid_pages를 폴더의 파일 이름이 들어있는 배열로 바꿉니다. 너무 열심히해서는 안됩니다. – KaeruCT

+0

아, 이제 알겠습니다. 무리 감사! –

0

이 시도 :

<?php include('pages/' . $_GET["page"] . '.txt'); ?> 
+0

이 작업은 방금 실수 한 바를 깨달았습니다. 감사합니다. –

0

먼저이 작업을 수행하지 마십시오! 너무 불안해! 이렇게하면 사이트의 모든 파일에 액세스 할 수 있습니다. SO BAD.

이제 실제 문제는 문자열이 작은 따옴표로 묶여 있다는 것입니다. 큰 따옴표로 변경하면 작동합니다. 그러나 당신은 여전히 ​​이것을해서는 안됩니다.

$foo = "QQQ"; 

echo "asfd{$foo}asdf"; 
> asfdQQQasdf 
echo 'asfd{$foo}asdf'; 
> asdf{$foo}asdf 

취약점을 해결하는 한 가지 방법은 화이트리스트를 사용하는 것입니다. 다음은 간단한 예제이다

$file = "foo"; 

switch ($file) { 
    case "foo": 
     include ("pages/foo.txt"); 
     break; 
    case "bar": 
     include ("pages/bar.php"); 
     break; 
    default: 
     echo "YOU CANNOT ACCESS THIS FILE!"; 
     break; 
} 

또 다른 방법은 허용되는 파일 이름의 배열을 가지고 요청 된 파일이 해당 배열에 있는지 확인하는 것입니다.

+0

나는 깨달았지만, 당신의 메시지는 나에게 약간 불명확 해 보입니다. 나는 그것을 정말로 얻지 못한다. –

+0

어떤 부분? 파일을 포함하는 더 좋은 방법의 예를 추가했습니다. – sachleen

+0

지금 보았습니다. 그러나 제 아이디어는 페이지를 쉽게 추가 할 수있게 해 주므로 실제 소스를 편집하지 않아도됩니다. 폴더에서 화이트리스트를로드 할 수있는 방법이 있습니까? –

0

이 작업을 수행해야하는 경우 다음

<?php include('pages/' . {$_GET["page"]} . '.txt'); ?> 

그러나 다른 사람이 언급 한 것처럼,이 보안 취약점을 노출한다. 최소한 페이지 매개 변수를 검사하여 웹 서버 외부의 파일로 연결되지 않도록하십시오.

0
$_GET['page'] = "index"; 
$allowed_page = array("index", "about", "contact"); 
$page = htmlentities($_GET['page']); 
if((isset($_GET['page']) && $_GET['page'] != "") && in_array($page, $allowed_page)){ 
$page = $_GET['page']; 
} 
$final_page = 'pages/' . $_GET["page"].'.txt'; 
include($final_page);