Php 包括安全相对路径和绝对路径

Php 包括安全相对路径和绝对路径,php,html,path,Php,Html,Path,我想知道在页面上使用include是否安全 我读到使用allow_url_include是不安全的,我以前在绝对路径中使用过它,但我发现我可以绕过相对路径的问题,但这真的安全吗 这样的东西真的有用吗 <?php $header= preg_replace('/[^a-zA-Z0-9_]/', '', $_GET['header']); include "http://mysite.co.uk/directory/$header.php"; ?> 下面是一个例子

我想知道在页面上使用include是否安全

我读到使用allow_url_include是不安全的,我以前在绝对路径中使用过它,但我发现我可以绕过相对路径的问题,但这真的安全吗

这样的东西真的有用吗

 <?php 
   $header= preg_replace('/[^a-zA-Z0-9_]/', '', $_GET['header']);
   include "http://mysite.co.uk/directory/$header.php"; 
  ?>

下面是一个例子,说明了我在上面的评论中提出的概念

$headers = array('loggedin.php','loggedout.php','someotherheader.php', 'etc.php');
$key     = (int) $_GET['header']; // We know it must be a integer so cast to int
$header  = $headers[$key];
include "http://mysite.co.uk/directory/$header"; 

这可以通过验证数组中是否存在密钥以及如果密钥没有默认为默认标头来改进。您也不应该通过URL包含文件。您应该使用磁盘上文件的路径。这要快得多。

这里有一个例子说明了我在上面的评论中提出的概念

$headers = array('loggedin.php','loggedout.php','someotherheader.php', 'etc.php');
$key     = (int) $_GET['header']; // We know it must be a integer so cast to int
$header  = $headers[$key];
include "http://mysite.co.uk/directory/$header"; 

这可以通过验证数组中是否存在密钥以及如果密钥没有默认为默认标头来改进。您也不应该通过URL包含文件。您应该使用磁盘上文件的路径。这要快得多。

总有比这更好的方法。甚至传递一个标识你想要的标题的键也是一个更好的主意。@johncode你能给我举个例子或给我指出正确的方向吗?我添加了一个答案,说明了我在说什么。总有比这个更好的方法。甚至传递一个标识您想要的标题的键也是一个更好的主意。@johncode您能给我举个例子或给我指出正确的方向吗?我添加了一个答案,说明了我所说的内容。因此,这将为标题本身分配一个键,然后您必须编写一些内容来验证它是否匹配?我喜欢这个概念,但我需要一段时间才能弄清楚如何正确地实施它!或多或少您只需要验证密钥是否存在。例如,如果将
$\u GET['header']
设置为
10
,则会导致上述代码出错,因为headers数组中没有第十一个元素。您只需检查该项,如果该键不存在,请将其设置为
0
1
(以更合适的为准)。这样您就可以在配置文件中分配所有值,并将其拉入脚本中使用?多个包含如何?例如页眉、页脚和侧边栏?是的。对于多个包含,您可以使用一个数组数组,其中每个内部数组包含每个键要使用的包含。因此,这将为标头本身分配一个键,然后您必须编写一些内容来验证它是否匹配?我喜欢这个概念,但我需要一段时间才能弄清楚如何正确地实施它!或多或少您只需要验证密钥是否存在。例如,如果将
$\u GET['header']
设置为
10
,则会导致上述代码出错,因为headers数组中没有第十一个元素。您只需检查该项,如果该键不存在,请将其设置为
0
1
(以更合适的为准)。这样您就可以在配置文件中分配所有值,并将其拉入脚本中使用?多个包含如何?例如页眉、页脚和侧边栏?是的。对于多个包含,可以使用一个数组数组,每个内部数组包含每个键要使用的包含。