2009-06-08 2 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.

Если вы хотите, я могу включить код формы для этой страницы?

код из bugs.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> 

Разъяснение

выше сценарий в index.php, который вызывает на странице, например,? = Приложение ошибок включает bugs.php в папке приложений.

Материал на bugs.php скрипт использует POST себе для передачи данных, однако, почтовые данные никогда не достигает самой страницы, так как мы застряли на странице ошибки, 404.php

ответ

0

Ну, ответ на вопрос, почему этого определенного приложения/page возникла проблема, потому что выбранным идентификатором было приложение, которое, кстати, было переменной приложения для страницы, поэтому оно не выводило правильные страницы.

ПодсказкаНе забудьте указать вашу недвижимость внимательно!

2

вы говорите, что формировать сообщения для себя, означает ли это, что вы используете POST?
Если это так, вам нужно изменить $ _GET [] на $ _POST []

Чем больше кода вы публикуете, тем лучше.

+0

еще отправленный код – bear

1

Некоторые комментарии:

  • Вы можете использовать $ _REQUEST, если вы хотите, чтобы получить переменную из POST или GET.
  • Вы, кажется, не устанавливаете $ app в любом месте.
  • Возможно, вам стоит подумать о том, чтобы быть более строгим в отношении того, какие файлы вы используете (например, белый список или шаблон, который должен соответствовать имени файла).
+0

Определенное $ приложение, вероятно, изменится на $ _REQUEST и будет более жестким, используя белый список после начальной альфы или приложения. – bear

0

Проблема, с которой вы сталкиваетесь, заключается в том, что вы используете method="post" в теге формы и пытаетесь получить данные от $_GET.

Когда method = "post" значения формы доступны через $_POST['fieldname'] или $_REQUEST['fieldname'] (который содержит значения POST и GET). Вы можете также изменить форму-х method к GET

Однако самая большая проблема, которую я могу увидеть ..

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

Это страшно, особенно если вы используете register_globals (который является единственным местом $app может пришли, в коде вы публикуемую)

$_GET['app'] Say установлен в ..

../../something/else.php 

.. вы будете включать ..

$_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("location: ..."):

header ('HTTP/1.1 301 Moved Permanently'); 
header ('Location: ' . $new_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