我不确定我是否完全理解站点安全的这一方面,但似乎将PHP文件保留在根目录下是个坏主意,所以我们将它们移到一个PHP文件夹中,并将此文件夹称为phpIncludes。一些模糊的问题是:
1) 如何访问phpIncludes中的文件doStuff.php?从javascript?让我的javascript告诉敏感内容所在文件夹的名称似乎是个坏主意,如:
executeAjaxCall("phpFiles/doStuff.php",success,error);
2) 或者来自驻留在根上的"主"PHP?这不能因为是根目录而被篡改吗?
$secretVariableThatOnlyThisPHPWouldKnow="bla"; //then check it in the included file? Does that work?
//in JS
executeAjaxCall("masterFile.php?fileNeeded=doStuff");
//in PHP
$secretVar="bla";
include("myPathString/phpIncludes/".$_GET['fileNeeded'].".php");
//in all other INCLUDEable PHP files
if (!isset($secretVar))
{
die();
}
if (!isFromThisDomain)
{
die();
}
(如何执行上次测试?)
我的想法是:"如果有人想把PHP文件放在phpIncludes文件夹中,他们不能,但他们可以通过HTML访问它们,所以请求需要验证。如果没有会话,比如在master.PHP中生成doStuff.PHP可以识别的东西,从而完成它的工作,这很容易实现吗?还是会话是最好的方法?"事实上,我想知道"无会话"的情况,因为这让我摆脱了试图实现反会话劫持代码的任务(如果我学会了……)。另一方面,我也在想:"变量secretVar是可访问/可篡改的吗?因为它将在根上?"
3) 按(2)操作,但在另一个文件夹中有master.php(让我们称之为"master"),使其成为非root?在这种情况下,我是否使用getcwd()+字符串操作从主文件夹访问phpIncludes文件夹?还是有一种"更优雅"(更懒…)的方法?
3似乎很神奇,我在root上的唯一文件是index.php,它只是启动HTML+JS,不做任何敏感的事情。还是我错过了什么?
你的PHP文件和文件夹结构是完全无关的。唯一重要的是:
当您访问特定的URL时会发生什么
phpFiles/doStuff.php
首先是URL。你如何访问它并不重要("直接"通过浏览器地址栏、AJAX、curl或其他任何方式);重要的是当访问该URL时会发生什么。这完全取决于你来确保每次访问URL都不会发生任何不希望发生的事情。
- 不要公开任何本来就不应该存在的URL。如果你有一堆php文件,它们不打算通过URL直接访问,那么就不要公开它们。这意味着您可以通过web服务器配置阻止对它们的访问(例如.htaccess文件中的
deny all
),也可以从公共webroot中删除这些文件 - 根据需要验证所有公开的URL端点中的所有输入和必要条件。用户需要登录才能执行某些操作?验证。您需要某些查询参数或POST正文数据吗?验证。在做任何事情之前,根据每个传入请求的优点对其进行验证。您是在每个文件中单独重复这个验证代码,还是在某个集中的地方重复,这取决于您自己
- 根据需要将代码拆分到多个文件中,以使其可重用。参见第1点。和2.,您只需注意哪些文件被公开为URL入口点,以及在什么时候需要进行什么样的验证