我使用php脚本包含另一个php文件。当有人使用错误的字符串转到index.php时,我希望它在屏幕上显示错误消息。
如何让它显示自定义错误消息,例如“您使用了错误的链接。请重试。”?
以下是我现在正在做的事情......
有人像这样来到网址......
http://example.com/?p=14
这会将他们带到index.php
文件,然后它会选择p
。然后在index.php
脚本中使用include ('p'.$p.'/index.php');
找到目录p14
并在该目录中包含index.php
文件。
我发现人们出于某种原因正在改变p=
并使其成为不是目录的东西。我想反对这一点,如果他们把其他东西放在那里就会显示错误。我有太多的目录,并且会添加更多,所以我不能只是一个简单的if ($p != '14'){echo "error";}
我必须做出大约45个。
那么对我说一个简单的方法是什么......“如果包含不起作用那么回声”错误“;”?
答案 0 :(得分:2)
$filename = 'p'.$p.'/index.php';
解决方案1:
if(!@include($filename)) throw new Exception("Failed to include ".$filename);
解决方案2:使用file_exists - 这会检查文件或目录是否存在,所以你也可以检查目录
if (!file_exists($filename)) {
echo "The file $filename does not exist";
}
答案 1 :(得分:1)
if(!file_exists('p'.$p.'/index.php')) die('error');
require_once('p'.$p.'/index.php');
答案 2 :(得分:1)
您永远不应该使用此包含解决方案,因为它可能容易受到code injection的攻击。</ p>
即使使用file_exists也不是一个好的解决方案,因为攻击者可以尝试服务器中某些未正确保护的文件,并获取对它们的访问权。
您应该使用白名单:包含用户可以包含的别名引用的文件的字典,如下所示:
$whiteList = array(
"page1" => "/dir1/file1.php",
"page2" => "/dirabc/filexyz.php"
)
if (array_key_exists($p, $whiteList)) {
include_once($whiteList[$p]);
} else {
die("wrong file");
}
通过这种方式,您不会将服务器文件结构暴露给Web,并保证只包含您允许的文件。
在使用之前,您必须清理$p
:
$p = filter_input(INPUT_GET, "p", FILTER_SANITIZE_STRING);
但是根据您在字典中使用的键,应该使用其他过滤器...查看reference。