3

我正在尝试找到一种安全的方法来执行以下操作:

  1. 用户在 html 表单中输入值。
  2. 表格已提交。
  3. PHP 使用提交的值作为“scandir”函数的参数。

我的理论是在 php 脚本中包含逻辑,该逻辑禁止绝对路径并要求目录名称包含某个值。

我担心黑客可以使用我的表单提交他自己的值并访问敏感文件。

这是一个 JQuery 插件。我不希望用户必须修改 PHP 文件。

下面的代码怎么会被黑?

<?php

$foo = $_POST["some_directory"];

//validate $foo

//make sure path to directory is relative
$foo_url_test  = parse_url($foo);
if (isset($foo_url_test['scheme']) || isset($foo_url_test['host'])) {
$foo = NULL;
}

//make sure the directory name contains 'bar123'
$foo_name_test = preg_split('_[\\\\/]_', $foo);
$foo_name_test = end($foo_name_test);
$foo_name_test = strpos($foo_name_test,'bar123');
if ($foo_name_test === false) {
$foo = NULL;
}

//make sure the path does not contain '..'
$foo_dot_dot_test = strpos($foo,'..');
if ($foo_dot_dot_test == TRUE || $foo_dot_dot_test === 0) {
$foo = NULL;
}

//get files
$files_array = scandir($foo);

?>
4

3 回答 3

2

您可能想查看realpath()

$foo = realpath($foo);
if (substr($foo, 0, 8) != '/my/path') {
    return false;
}

...或类似的东西。

于 2009-07-01T02:11:24.183 回答
1

您可能需要进一步详细说明此脚本的目的以及它为什么要读取任意目录。没有这方面的知识,很难评论这段代码的安全性,除了指出这是一件极其危险的事情,对可访问目录没有明确的限制。

一方面,我永远不会在我的服务器上安装允许远程攻击者指定要读取的目录的 PHP 脚本 - 甚至能够找出特定文件或目录是否存在。

有一个强有力的论据要求用户编辑由 php 读取的配置文件,该文件允许服务器所有者将允许由该脚本打开的一组目录列入白名单

OP回复后更新

您在这里遇到的问题是所有“ajax”请求都是直接由浏览器发出的。这意味着网络服务器在发出 ajax 请求的 html 页面中设置的任何数据都可能被恶意用户覆盖。任何人都可以随时使用任何参数发出您的 ajax 请求,除非您确保它不这样做。

一旦您的数据离开您的服务器,您就无法再信任它。确保此安全的最佳方法是在服务器端保存允许目录的白名单。如果您收到对不在允许列表中的目录的请求(或者可能不在允许列表中某项下的子目录中),那么您拒绝该请求并给出标准错误响应。

于 2009-07-01T10:16:51.760 回答
0

您的目录名称可以包含..元素,因此它们可以在您打算限制它们的当前工作目录之外查看。不过,他们仍然只能查看您想要命名的目录。

FWIW,parse_url()用来分析目录名是否是相对的,真的很奇怪。你为什么不直接找$foo[0] == '/'

(当然,这假定了 Unix 路径约定,但您的代码已经这样做了。)

于 2009-07-01T01:50:34.383 回答