您能看到此代码有什么问题,还是可以进行优化?
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
,后期数据永远不会到达页面本身答案 0 :(得分:2)
你是说表单发布到自己,这是否意味着你正在使用POST?
如果是这样,你需要将$ _GET []更改为$ _POST []
发布的代码越多越好。
答案 1 :(得分:1)
一些意见:
答案 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变量,因此它没有获取正确的页面。
提示 请务必仔细命名您的媒体资源!