2009-06-08 3 views
0

이 코드에 문제가 있는지, 최적화 할 수 있습니까?PHP에 문제가있는 것이 있습니까?

의 index.php에서 코드 파일

if(empty($_GET['t'])) { 
    $folder = "apps/"; 
}else { 
    $folder = str_replace("/", "", $_GET['t']) . "/"; 
}  

if(empty($_GET['app'])) { 
    include('apps/home.php'); 
} else { 
    if(file_exists($folder.$app.".php")) { 
     include($folder.$app.".php"); 
    } else { 
     include("/home/radonsys/public_html/global/error/404.php"); 
    } 
} 

내 문제을 포함 하는가? 하나의 페이지는 자체 페이지로 이동하여 404 페이지로 돌아갑니다.

원하는 경우 해당 페이지의 양식 코드를 포함 할 수 있습니까?

코드 위의 스크립트가 페이지에서 호출 index.php를, 예를 들면에

대한 설명

<form method="post" action=""> 
    <div>Title</div> 
    <div><input name="title" type="text" class="bginput" value="" size="59" tabindex="1" /></div> 
    <br /> 
    <div> 
     <label class="smallfont"> 
      Application 
      <select name="app" style="display:block; width:200px" tabindex="2"> 
       <option value="Admin CP">AdminCP</option> 
       <option value="Add User">Add User</option> 
       <option value="Bugzilla">Bugzilla</option> 
       <option value="Portal">Portal</option> 
       <option value="To Do">To Do</option> 
       <option value="Internal Messages">Internal Messages</option> 
       <option value="User CP">UserCP</option> 
       <option value="Change Password">Change Password</option> 
       <option value="Change Email">Change Email</option> 
       <option value="General">General</option> 
      </select> 
     </label> 
    </div> 
    <br /> 
    <div>Bug Description</div> 
    <textarea name="content" style="width:7%"></textarea> 
    <br /> 
    <div> 
     <label class="smallfont"> 
      Priority 
      <select name="priority" style="display:block; width:200px" tabindex="2"> 
       <option value="0" selected="selected">Unknown</option> 
       <option value="1">1 - Highest</option> 
       <option value="2">2</option> 
       <option value="3">3</option> 
       <option value="4">4</option> 
       <option value="5">5 - Medium</option> 
       <option value="6">6</option> 
       <option value="7">7</option> 
       <option value="8">8</option> 
       <option value="9">9</option> 
       <option value="10">10 - Lowest</option> 
      </select> 
     </label> 
    </div> 
    <br /> 
    <input type="submit" value="Save" /> 
</form> 

bugs.php? 응용 프로그램은 = 버그 bugs.php을 포함에서 apps 폴더에 있습니다. bugs.php 스크립트에

물건 당신이 말을하는 404.php

답변

0

글쎄, 왜 특정 응용 프로그램에 대한 답을/page는 문제가 발생했습니다. 왜냐하면 select id가 app 였기 때문에 app 변수가 페이지에 대한 것이기 때문에 올바른 페이지를 가져 오지 못했습니다.

속성의 이름을주의해서 지정해야합니다.

2

, 우리는 오류 페이지와 함께 붙어있어 이후하지만, 포스트 데이터가 페이지 자체를 결코 도달하지, 데이터를 전송하기 위해 자체 POST를 사용 게시물 자체가 POST를 사용하고 있다는 뜻입니까?
만약 그렇다면 $ _GET []을 $ _POST []로 변경해야합니다.

게시하는 코드가 많을수록 좋습니다.

+0

더 많은 코드가 게시되었습니다. – bear

1

일부 의견 : 당신이 POST에서 변수를 얻거나 GET 하려면

  • 당신은 $ _REQUEST를 사용할 수 있습니다.
  • 어디에도 $ APP 을 설정하지 않은 것 같습니다.
  • 포함 할 파일 (예 : 파일 이름이 일치해야하는 허용 목록 또는 패턴)을 더욱 엄격하게 설정하는 것이 좋습니다.
+0

정의 된 $ app은 (는) $ _REQUEST로 변경되며 초기 알파 또는 애플리케이션 이후에 허용 된 사이트 목록을 사용하여 더욱 엄격해질 것입니다. – bear

0

양식 태그에 method="post"을 사용 중이며 $_GET에서 데이터를 가져 오는 중 문제가 발생했습니다.

method = "post"의 경우 양식 값은 $_POST['fieldname'] 또는 $_REQUEST['fieldname'] (POST 및 GET 값 모두 포함)을 통해 액세스 할 수 있습니다. 당신은 또한 변경 될 수 있습니다 method 그러나

GET에, 내가 볼 수있는 가장 큰 문제는 .. 폼의 당신이 $app가 할 수있는 유일한 장소이다 (register_globals를 사용하는 경우 특히, 무서운

include($folder.$app.".php"); 

당신이 게시 코드)

$_GET['app']로 설정 말 ..

../../something/else.php 
,536,913에서에서 온

.. 당신은 포함 할 것입니다 ..

$_GET['t'] . "../../something/else.php" 

당신이 동적으로 사용자 입력을 기반으로 파일을 포함이 아닌 모든 영숫자을 제거하고 유효한 파일의 화이트리스트가 경우 - 다음과 같은 :

$valid_files = array("General", "Todo"); 
$safe_filename = preg_replace("/[^a-zA-Z0-9]/", "", $_REQEST["app"]); 
if(in_array($safe_filename, $valid_files)){ 
    include("apps/" . $safe_filename . ".php"); 
} 
을 당신이 가진 것 물론

header ('HTTP/1.1 301 Moved Permanently'); 
header ('Location: ' . $new_location); 

안전을에 :

header("location: ...") 사용 예를 들어, 라우팅을하는 다른 방법이 있습니다 $new_location 살균하지만 (동적으로 서버에서 임의의 스크립트를 실행하지 이후) include()를 사용하는 것보다 적은 문제가

기본적으로 같은 것을 할 것입니다 스크립트 :

$safe_filename = preg_replace("/[^a-zA-Z0-9]/", "", $_REQUEST["app"]); 
$new_location = "/apps/" . $safe_filename . ".php"; // construct new URL 

// If it's valid, redirect, if not, return error 404 
if(in_array($safe_filename, $valid_destinations)){ 
    header ('HTTP/1.1 301 Moved Permanently'); 
    header ('Location: ' . $new_location); 
} else { 
    header("HTTP/1.0 404 Not Found"); 
} 
+0

정규 표현식이 문자열에서 모든 것을 제거하고 있습니다. – bear

+0

많은 파일이 있기 때문에 화이트리스트를 사용하면 엄청난 양의 바이트가 생성됩니다. – bear