为什么要使用 realpath()


Why use realpath()?

PHP的realpath()在手册中有很好的描述,我只是想了解它在哪些场景中是有用的。因为我的代码似乎在像../../path这样的路径上工作得很好,所以我不确定realpath()在哪里有用甚至必要。

消息是

当您对路径使用"点-点-斜杠"时,您将处于使用路径遍历进行攻击的警告状态,此攻击旨在访问存储在 Web 根文件夹外部的文件和目录。通过操作使用"点-点-斜杠"(../) 序列及其变体,可以访问存储在文件系统上的任意文件和目录,包括应用程序源代码、配置和关键系统文件,受系统操作访问控制的限制。攻击者使用"../" 序列向上移动到根目录,从而允许在文件系统中导航。

可以使用在路径上注入的外部恶意代码(如资源注入攻击)来执行此攻击。要执行此攻击,无需使用特定工具;攻击者通常使用蜘蛛/爬虫来检测所有可用的 URL。

这种攻击也被称为"点-点-斜杠"、"目录遍历"、"目录爬升"和"回溯"。

你可以检查一下..

而且,好消息是...

realpath() 将允许您将任何可能包含相对信息的路径转换为绝对路径。然后,您可以确保该路径位于要允许访问的某个子目录下。

对于绝对路径(例如URL),可以控制您的子域和协议。通过模糊的子域进入的人将被汇集到正确的子域中。您可以根据需要在安全和非安全之间来回跳转。而且,使用它可以是可配置的,开发人员喜欢绝对的东西。

使用绝对 URL 时,您可以设计简洁的算法。URL 可以设置为可配置的,以便只需在单个配置文件中进行一次更改即可在站点范围内更新 URL。

但如果你看看这个:

<a href=“index.php?q=”>index.php?q=</a>
<link src=“../.././../css/default.css” />

你不困惑吗?

  1. 令人困惑,那是多少个点?那是多少个文件夹?在哪里文件?为什么它不起作用?
  2. 维护,如果文件被意外移动资源退出加载,链接将用户发送到错误的页面,表单数据可能会发送到不正确的页面。如果文件需要移动所有资源将退出加载以及将要停止加载的所有链接不正确需要更新。
  3. 当网页变得更加复杂和视图时,它不会缩放开始在多个页面上重复使用相对链接相对于它们所包含的文件。如果您有HTML的导航片段,将出现在每个页面上相对将相对于很多不同的地方。第一个人们在开始创建模板时意识到的是他们需要一种方法来管理 URL。
  4. 计算 - 它们由您的浏览器实现(希望根据到RFC)。见RFC3986第5章。
  5. 哎呀!! - 错误或拼写错误可能会导致蜘蛛陷阱。

对不起,我的英语不好... :)

根据我的经验,我发现realpath()有用的

1. 清晰度

当显示/记录/存储完整路径而不是相对路径时,更合适。

2. 安全

确保给定的文件路径低于(在文件系统层次结构中)"基本"路径,然后再对该文件执行某些操作(服务、编辑等...

例:

$full_path = realpath( $relative_path );
if( $full_path !== false && strpos( $full_path, "/var/www/whatever/" ) === 0 )
{
    //...
}
<小时 />

有几件事值得一提:

realpath()解析符号链接。

如果文件或目录不存在,realpath()将返回FALSE