gpt4 book ai didi

php - dirname 是否足以防止目录遍历攻击?

转载 作者:可可西里 更新时间:2023-10-31 23:41:08 25 4
gpt4 key购买 nike

考虑以下经典问题案例:

<?php
$filename = "/tmp/".$_GET['f'];
readfile($filename);

此代码容易受到 directory traversal attack 的攻击,例如,如果 $_GET['f'] 的值为 ../etc/shadow,则该文件的内容将被泄露给攻击者。

有一些众所周知的方法可以防止此类攻击;我不是在问如何做到这一点。问题是:dirname的以下用法吗?防止攻击的防弹方法?

<?php
if (dirname($_GET['f']) != '.') die ('Attack prevented');

听起来应该是因为 dirname:

  • 返回 . 当且仅当输入路径中没有斜杠(在线文档保证不那么严格,但 the source 是明确的)
  • 是二进制安全的(因此不会被嵌入的空值欺骗)

据我所知,唯一可能的攻击途径是以编码方式将数据传递给 $_GET['f'],这样字符 /\(别忘了 Windows)编码为同时包含相应字符的ASCII值底层 C 运行时库的 fopen 函数必须透明地支持此编码。

无 ASCII 值限制排除了所有单字节编码、UTF-8 和两种类型的 UTF-16;此外,由于 C 运行时的规范与平台无关,因此攻击只能适用于某些使用“易受攻击”编码来表示名称的文件系统。据我所知,这样的文件系统并不存在;任何人创造它都没有意义;最后,PHP 不会托管在这样一个假设的奇异系统上,即使它存在也是如此。

总之,在我看来,这张支票是 100% 安全的。我错过了什么吗?

最佳答案

我不确定我是否会声称某些东西是 100% 安全的。就是说,我想不出一个明显的情况表明这是不安全的,并且我尝试了大量的排列来反对它。也就是说,您需要添加一个 $_GET['f'] 不为空的检查。访问包含上述代码但 f 没有值的页面会给我“攻击已阻止”消息,这可能不是预期的效果。

<?php
if (!empty($_GET['f']) && dirname($_GET['f']) != '.') die ('Attack prevented');

关于php - dirname 是否足以防止目录遍历攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19447199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com