如果包含找不到文件,如何回显错误消息

时间:2017-07-12 00:08:13

标签: php

我使用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个。

那么对我说一个简单的方法是什么......“如果包含不起作用那么回声”错误“;”?

3 个答案:

答案 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