PHP realpath()
在manual中得到了很好的描述,我只是想了解它在哪些场景中很有用。因为似乎我的代码与../../path
之类的路径运行良好,所以我不确定realpath()
在哪里有用甚至是必要的。
答案 0 :(得分:3)
糟糕的新闻
当您使用“dot-dot-slash”作为路径时,您处于警告状态,使用Path Traversal 攻击,此攻击的目的是访问那些文件和目录存储在Web根文件夹之外。通过使用“dot-dot-slash”(../)序列及其变体来操纵引用文件的变量,可以访问存储在文件系统上的任意文件和目录,包括应用程序源代码,配置和关键系统文件,受系统操作访问控制的限制。攻击者使用“../”序列移动到根目录,从而允许通过文件系统进行导航。
此攻击可以通过路径上的外部恶意代码注入执行,例如 Resource Injection 攻击。要执行此攻击,不必使用特定工具;攻击者通常使用蜘蛛/爬虫来检测所有可用的URL。
这种攻击也被称为“dot-dot-slash”,“目录遍历”,“目录攀爬”和“回溯”。
你可以检查一遍..
并且,好消息是....
realpath()允许您将任何可能包含相对信息的路径转换为绝对路径。然后,您可以确保该路径位于您要允许访问的某个子目录下。
对于URL等绝对路径,可以控制子域和协议。通过一个不起眼的子域进入的人将被汇入正确的子域。您可以根据需要在安全和非安全之间来回跳转。并且,使用它可以是可配置的,开发人员喜欢绝对的东西。
使用绝对URL时,您可以设计整洁的算法。 URL可以进行配置,以便只需在单个配置文件中进行一次更改即可在站点范围内更新URL。
但如果你看一下:
<a href=“index.php?q=”>index.php?q=</a>
<link src=“../.././../css/default.css” />
你不是在混淆吗?
抱歉我的英语不好......:)
答案 1 :(得分:1)
根据我的经验,我发现realpath()
对
更希望显示/记录/存储完整路径而不是相对路径。
在执行某些操作(服务,编辑等)之前,请确保给定的文件路径位于文件系统层次结构中的之下(在文件系统层次结构中) >
示例:
$full_path = realpath( $relative_path );
if( $full_path !== false && strpos( $full_path, "/var/www/whatever/" ) === 0 )
{
//...
}
几件事值得一提:
realpath()
解析符号链接。
realpath()
返回FALSE
。