如果我有这个索引:
if (isset($_GET['se'])) {
$se= $_GET['se'];
if (file_exists("{$se}.php")){
require("{$se}.php");
}
else {
require("page_error.php");
}
}
else {
require("page_error.php");
}
以下链接不起作用:
$pwrurl = "http://example.com/login/?se=change_password?usermail=".$email."&usercode=".$linkHash;
只接受http://example.com/login/?se=change_password
这样的内容。
这可以解决吗?
答案 0 :(得分:5)
小心!
让用户决定要包含哪个文件而不进行任何验证会为您的服务器带来漏洞。他们可以将您的脚本指向任何敏感文件。
你应该限制可以包含的内容的可能性,例如:
$allowed_files = array(
"page_error",
"some_section",
"some_other_section",
"change_password"
);
$se = empty($_GET['se']) ? "page_error" : $_GET['se'] ; // "page_error" by default.
if (in_array($se, $allowed_files)){
require("{$se}.php");
} else {
require("page_error.php");
}
这样他们只能读取你放在数组中的文件。
编辑:另外,就像其他人说的一样,你应该在URL中用&分隔不同的param =参数对。代替 ?。的?用于将页面名称与参数列表分开。
http://example.com/login/?se=change_password&usermail=...
答案 1 :(得分:3)
网址中有两个?
。必须使用&
分隔多个参数。
您使用require
非常危险。阅读安全性。在将任何参数传递给这样一个危险的函数之前验证它,或者您的站点将立即被黑客入侵。
答案 2 :(得分:2)
链接错误,应该是'&'代替 '?'在change_password之后。
$pwrurl = "http://example.com/login/?se=change_password&usermail=".$email."&usercode=".$linkHash;