Что-то не так с этим PHP - PullRequest
       50

Что-то не так с этим PHP

0 голосов
/ 08 июня 2009

Видите ли вы что-то не так с этим кодом или его можно оптимизировать?

Код из 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, который вызывает страницу, например,? App = bugs включает bugs.php в папке приложений.

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

Ответы [ 4 ]

2 голосов
/ 08 июня 2009

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

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

1 голос
/ 08 июня 2009

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

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

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

Совет Не забудьте назвать свои свойства тщательно!

0 голосов
/ 08 июня 2009

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

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

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

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

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

Скажите, $_GET['app'] установлен в ..

../../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");
}
...