这个PHP有什么问题

时间:2009-06-08 15:23:22

标签: php html forms include directory

您能看到此代码有什么问题,还是可以进行优化?

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包含apps文件夹中的bugs.php。

bugs.php脚本上的东西使用POST来自己发送数据,但是,由于我们遇到错误页面404.php

,后期数据永远不会到达页面本身

4 个答案:

答案 0 :(得分:2)

你是说表单发布到自己,这是否意味着你正在使用POST?
如果是这样,你需要将$ _GET []更改为$ _POST []

发布的代码越多越好。

答案 1 :(得分:1)

一些意见:

  • 如果您愿意,可以使用$ _REQUEST 从POST或GET获取变量。
  • 您似乎没有设置$ app 任何地方。
  • 您可能希望考虑更严格地包含哪些文件(例如文件名必须匹配的白名单或模式)。

答案 2 :(得分:0)

您遇到的问题是因为您在表单标记中使用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");
}

答案 3 :(得分:0)

嗯,为什么某个应用程序/页面出现问题的答案是因为select id是app,顺便提一下,它是页面的app变量,因此它没有获取正确的页面。

提示 请务必仔细命名您的媒体资源!