我想知道我的代码是否安全以及是否有其他更安全的替代方案来包含外部文件..
所以这是我的代码示例,它安全吗?我怎样才能让它更安全?谢谢!
<?php switch($_GET['p']){
case 'test1':
include 'test1.php';
break;
case 'test2':
include 'test2.php';
break;
case 'test':
echo 'something';
include 'pages/test.php';
echo 'something';
break;
default:
include 'main.php';
break;
} ?>
答案 0 :(得分:6)
你的代码很好。由于文件名是硬编码的,因此有条件地包括您正在执行的文件没有问题。当包含的文件基于用户的未清理值时,会出现此问题。 E.g
include $_GET['p'];
其中包括用户想要的任何内容(取决于PHP设置,它可能还包括其他域上的文件)
其他选项是您正在做的事情的变化
如果文件不存在, require
和require_once
将失败。 inlucde_once
和require_once
确保该文件仅包含一次,因此该文件已包含在程序中的其他位置,但不会包含该文件。
include_once 'myfile.php';
include_once 'myfile.php'; //does nothing as the file is already included
如果您有使用课程,还可以选择autoloader。从应用程序的外观来看,您必须重新构建它才能使用它。
答案 1 :(得分:1)
在进入交换机之前,您可能会考虑检查$_GET['p']
的内容。如果它包含特殊字符,垃圾或其他内容,您的程序可能希望记录事件(而不是浪费时间尝试呈现页面)。
至少,一个美好而礼貌的“抱歉,我们无法处理您的请求”页面将是有序的。
这仍然允许切换到主页面,前提是p
包含了一些值得开关评估的东西。
如果主页面进行任何数量的查询以进行渲染,则尤其如此。迟早,有人会注意到你的URI结构并决定玩它可能很有趣,不要在白痴上烧掉CPU周期:)
答案 2 :(得分:0)
看到你只包括你硬编码的那些,我不明白为什么这不安全。这些不是外部文件,但我明白你的意思。外部意味着在不同的服务器上。
至于你的问题,include
的唯一替代方法是require
,但这不一定更安全,它的工作方式不同。
答案 3 :(得分:0)
是的,非常安全。
您包含了解内容的文件,而不是根据来自外部来源的变量执行此操作。如果无法加载,则包含不会导致脚本失败,如果这是您想要的结果,请选择require('filename');
。
答案 4 :(得分:0)
它是安全的,并且switch语句使逻辑更清晰。只是为了让它更安全,你可以使用$ __ POST来隐藏开关变量数据源,使它更安全一些。 :d
答案 5 :(得分:-1)
您可以使其更具可读性,如下所示:
$safeIncludes = array('test1', 'test2', 'test3');
$p = $_GET['p'];
if(in_array($p, $safeIncludes)) {
$scriptName = $p . '.php';
include($scriptName);
}
除此之外 是安全的,正如其他人所指出的那样。