发送变量的PHP文件系统函数表单提交(Sending Variables for PHP FileS

2019-06-25 09:03发布

我试图找到一种安全的方式来做到以下几点:

  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);

?>

Answer 1:

你可能想看看真实路径() 。

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

...或类似的东西。



Answer 2:

你可能需要进一步阐述这个脚本的目的和为什么它要读取任意目录。 如果没有这方面的知识,很难对这个代码的安全性发表意见,除了指出它是做一个非常危险的事情,而对访问的目录明显的局限性。

拿我来说,永远不会安装一个PHP脚本到我的服务器,它允许远程攻击者指定目录下读取 - 甚至可以找出是否存在一样的特定文件或目录。

在设计需要用户编辑配置文件,通过PHP读取一个有力的论据,即允许服务器所有者白名单中的一组被允许通过这个脚本打开目录

从OP回复后更新

你有这里的问题是,所有的“Ajax”的请求被从浏览器直接进行。 这意味着,Web服务器设置在HTML页面中,使Ajax请求可以被恶意用户覆盖的任何数据。 您的Ajax请求可以被任何人在任何时间进行任何参数,除非你将其固定到否则什么。

作为为您的数据离开你的服务器很快,你不能再信任它。 使这个安全的最好方法是保持在服务器端允许的目录的白名单。 如果您收到一个目录不在允许列表上(或者也许不是在允许列表下面的东西子目录)的请求,那么你拒绝请求,并给出一个标准的错误响应。



Answer 3:

您的目录名称可以包含..元素,使他们可以看到你为了限制他们当前的工作目录之外。 他们仍然将只能看你有心命名的目录,虽然。

FWIW,使用parse_url()来分析一个目录名称是否相真是离奇。 你为什么不只是寻找$foo[0] == '/'

(这假定一个Unix路径惯例,当然,但你的代码已经做到这一点。)



文章来源: Sending Variables for PHP FileSystem Functions with Form Submission