通过表单提交发送PHP文件系统函数的变量
我正试图找到一种安全的方法来执行以下操作:通过表单提交发送PHP文件系统函数的变量,php,security,scandir,Php,Security,Scandir,我正试图找到一种安全的方法来执行以下操作: 用户在html表单中输入值 表格已提交 PHP使用提交的值作为“scandir”函数的参数 我的理论是在php脚本中包含逻辑,它禁止绝对路径,并要求目录名包含特定值 我担心的是,黑客可能会使用我的表单提交自己的值并访问敏感文件 这是一个JQuery插件。我不希望用户必须修改PHP文件 下面的代码怎么可能被黑客入侵 <?php $foo = $_POST["some_directory"]; //validate $foo //make su
<?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);
?>
您的目录名可以包含
。
元素,因此它们可以查看您要限制它们的当前工作目录之外的内容。不过,他们仍然只能查看按您的意愿命名的目录
FWIW,使用parse_url()
来分析目录名是否是相对的真的很奇怪。为什么不直接查找$foo[0]=='/'
(当然,这是假定Unix路径约定的,但您的代码已经这样做了。)您可能想看看
…或类似的内容。您可能需要进一步详细说明此脚本的用途以及它希望读取任意目录的原因。没有这些知识,很难对这段代码的安全性进行评论,除非指出这是一件极其危险的事情,对可访问的目录没有明确的限制 一、 首先,我不会在我的服务器上安装允许远程攻击者指定要读取的目录的PHP脚本,甚至不会发现特定文件或目录是否存在 有一个强有力的理由要求用户编辑由php读取的配置文件,该文件允许服务器所有者列出一组允许此脚本打开的目录 OP回复后更新 这里的问题是,所有“ajax”请求都是由浏览器直接发出的。这意味着Web服务器在html页面中设置的、发出ajax请求的任何数据都可能被恶意用户覆盖。您的ajax请求可以由任何人在任何时间使用任何参数发出,除非您确保它不这样做
一旦数据离开服务器,您就不能再信任它。使其安全的最佳方法是在服务器端保留一个允许目录的白名单。如果收到对不在允许列表中的目录(或者可能不在允许列表中某个目录下的子目录)的请求,则拒绝该请求并给出标准错误响应。BTW,请始终使用“==”测试strpos()的返回是否为“false”!该脚本是一个JQuery插件,用于向网页添加图像显示。网站管理员将图像所在目录的名称添加到plugin语句:$('some_div')我想要一种安全的方式来使用该设置,这样多个网页可以使用具有不同图像和目录的插件,但都使用相同的php doc.BTW:该插件通过AJAX将目录名传递给php脚本,该脚本返回包含图像标记的html,插件然后将html添加到网页中。谢谢你的建议。我将问题中的代码示例更改为适用于ms dos或unix路径类型。你看到什么问题了吗?
$foo = realpath($foo);
if (substr($foo, 0, 8) != '/my/path') {
return false;
}