私人维基包含一个名为上传.php允许用户上传使用web浏览器将文件发送到wiki服务器。上传的文件(也称为附件)然后可以使用wiki页面中的标记轻松访问。本页介绍如何安装和配置上载功能。
关于的一些注释安全
PmWiki采取了一种有点但合理的偏执态度当谈到上传功能时。因此上传往往会尽量限制该功能:
- 默认情况下,上载功能被禁用
- 即使您启用了该功能,默认情况下该功能也是密码锁定的
- 即使你删除了密码,你也只能上传具有特定名称、扩展名和大小的文件
- 上传文件名中可能出现的字符是(默认)字母数字、连字符、下划线、点和空格(另请参见此处).
- 最大上传大小较小(默认为50K)
这样,潜在的损害在wiki之前/之前是有限的管理员明确放宽了限制。
请记住,让用户(匿名!)向您的web服务器上传文件确实会带来一定的风险。这个上传.php脚本的设计是为了减少危险,但wiki管理员应该意识到存在潜在的漏洞,上传实用程序的错误配置可能会导致不必要的后果。
默认情况下,授权用户可以覆盖已经上传的文件,而不可能恢复文件的先前版本。如果要禁止用户覆盖已上载的文件,请将以下行添加到配置.php:
$EnableUploadOverwrite=0;
或者,管理员可以保留旧版本共个上传。
管理员还可以配置PmWiki,因此密码机制控制对上传文件的访问。
基本安装
这个上传.php脚本自动包含在标准配置.php如果$EnableUpload(启用上载)
变量在中为true配置.php此外,配置.php可以设置$上传目录
和$上传UrlFmt
变量指定上传文件应存储的本地目录,以及可用于访问该目录的URL。默认情况下,$上传目录
和$上传UrlFmt
假设上传将存储在名为上传/在当前目录中(通常是包含pmwiki.php网站). 此外,配置.php还应设置默认上传密码(请参阅密码管理员).
因此,一个基本的配置.php对于上传,可能如下所示:
<?php if(!defined('PmWiki'))exit();##启用上载并设置站点范围的默认上载密码。$EnableUpload=1;$UploadPermAdd=0;$DefaultPasswords['upload']=pmcrypt('secret');
如果您有编辑密码并希望允许所有具有编辑权限的用户上传,而不是$DefaultPasswords(默认密码)
[“上传”],您可以设置$句柄授权
['upload']='编辑';
在config.php中。
重要:暂时不要创建上传目录!见下一段。
您可能还需要显式设置将保存上传的文件系统目录,并提供与该目录对应的URL,如:
$UploadDir=“/home/foobar/public_html/uploads”;$UploadUrlFmt=“https://example.com/~foobar/uploads“;
注意:在大多数安装中,您不需要定义或更改这些变量,通常PmWiki可以检测到它们(如果您这样做,上传可能根本就不起作用)。
上传目录配置
可以配置上传现场范围,按组(默认),或分页通过更改$上传前缀Fmt
在里面配置.php
。这决定了所有上传是放在站点的一个目录中,还是放在每个组的一个单独目录中,或者放在每个页面的单独目录中。默认设置是按组组织上传。
建议$上传前缀Fmt
config.php中定义的变量对于wiki中的所有页面都是相同的,在组或页面本地配置文件中没有不同。否则你将无法链接到其他Wiki组中的附件。
单个上传目录
对于站点范围的上传,请使用
$UploadPrefixFmt=“”;
每页上载目录
要按页面组织上传,请使用:
$UploadPrefixFmt=“/$Group/$Name”;
如果您计划在单个页面上附加多个文件,那么您可能更喜欢按页上传,而不是按组或按面上传。例如,此设置简化了图片库的管理。(在页面中,您始终可以链接到其他页面的附件。)
上传目录
为了使上传功能正常工作,$UploadDir给定的目录必须可由web服务器进程写入,并且它通常必须位于web可以访问的位置(例如,位于公共html). 在启用上传的情况下执行PmWiki将提示您在服务器上创建上传目录所需的一组步骤(不同服务器的上传目录不同)。请注意,在这种情况下,您可能需要显式创建可写组或页面特定的子目录!
上传文件
启用上传功能后,用户可以通过添加“?action=上传
“到普通PmWiki URL的末尾。将提示用户输入上传密码,类似于其他页面要求输入密码的方式(请参阅密码和密码管理员有关在页面、组和整个站点上设置密码的信息)。
访问上传表单的另一种方法是插入标记“附加:filename.ext
“添加到现有页面中,其中文件名.ext
要上载的新文件的名称。显示页面时,会显示“?”-链接”将添加到标记的末尾,以将作者带到上传页面。(请参见上传用于语法变化。)
默认情况下,PmWiki会将上传的文件组织到每个组的单独子目录中。可以通过修改$上传前缀Fmt
变量。请参见菜谱:UploadGroups了解详细信息。
上传文件的版本控制
默认情况下,PmWiki不管理上传文件的版本。但是,通过设置$EnableUploadVersions(启用上载版本)
=1;
管理员可以将较旧版本的上传与最新版本一起保留在上传目录中。
上传限制
限制组和页面的上传文件
只能通过使用组自定义。只需设置$EnableUpload(启用上载)
=1;
对于那些要启用上传的组或页面;交替设置$EnableUpload(启用上载)
=1;
在config.php文件中,然后设置$EnableUpload(启用上载)
=0;
在要禁用上传的逐组或逐页自定义文件中。
限制组或整个wiki的上传总大小
上传可以限制为组的总大小限制。在组配置文件(即local/group.php)中,添加行
这将把该组的上传总大小限制为1000KB——任何超过限制的上传都将被拒绝,并显示错误消息。此值默认为零(无限制)。
上传也可以限制为所有上传的总大小限制。添加线条
这将把整个wiki的上传总大小限制为10000KB——任何超出限制的上传都将被拒绝,并显示错误消息。此值默认为零(无限制)。
限制上传文件的类型和大小
上传脚本在将上传文件存储到上传目录之前,对上传文件执行多次验证。基本验证如下所述。
- 文件名
- 上传文件的名称只能包含字母、数字、下划线、连字符、空格和句点,并且名称必须以字母或数字开头和结尾。
- 文件扩展名
- 仅具有批准扩展名的文件,例如“
.gif文件
", ".jpeg格式
", ".doc文件
允许将等上载到web服务器。这对服务器安全至关重要,因为web服务器可能会尝试执行或专门处理扩展名为“.php文件
", ".cgi
”等。 - 文件大小
- 默认情况下,根据
$上传最大大小
变量。因此,要将所有上传限制为100KB,只需为指定一个新值$上传最大大小
在里面配置.php:
$UploadMaxSize=100000;
但是,也可以为上传的每种类型的文件指定默认的最大文件大小。因此,管理员可以限制“.gif文件
“和”.jpeg格式
“文件大小为20K,”.doc文件
“文件大小为200K,所有其他文件大小为$上传最大大小
. The$UploadExtSize(上传扩展大小)
数组用于确定哪些文件扩展名有效,以及每个文件类型的最大上载大小(以字节为单位)。例如:
$UploadExtSize['gif']=20000;#将.gif文件限制为20KB
禁用按文件类型上载文件
将条目设置为零将完全禁用该类型的文件上载:
$UploadExtSize['zip']=0;#不允许.zip文件$UploadExtSize[“”]=0;#不允许没有扩展名的文件
您可以通过禁用所有默认值并仅指定所需类型来限制可上载的文件类型。设置变量$上传最大大小
设置为零将禁用所有默认文件类型。然后可以通过使用变量设置单个文件类型的最大大小来启用$UploadExtSize(上传扩展大小)
。
#关闭所有上传扩展$UploadMaxSize=0;#仅启用这些文件类型进行上传$a大小=100000;//100 KB文件大小限制$UploadExtSize['jpg']=$aSize;$UploadExtSize['gif']=$aSize;$UploadExtSize['png']=$aSize;
注意:具有多个扩展名的文件
Apache服务器上的某些安装会尝试执行一个文件,该文件的名称包含“.php”、“.pl”或“.cgi”,即使它不是文件名的最后一部分。例如,可能会执行名为“test.php.txt”的文件。要禁止上传此类文件,请在config.php中添加以下行:
$上传黑名单
=数组(“.php”、“.pl”、“.cgi”);
将新文件类型添加到允许的上载
要将新的扩展名添加到允许的上传类型列表中,请在本地自定义文件:
$UploadExts['ext']='内容类型';
哪里提取是要添加的扩展,并且内容类型是“MIME类型“,或content-type(您可以在国际机场协会,自由格式设置工具,Apache mime类型,或互联网媒体类型)用于具有该扩展名的文件。例如,要添加“dxf型
'内容类型为的扩展'图像/x-dxf
',放置线
$UploadExts['dxf']='image/x-dxf';
中的每个条目$上传分机
需要是扩展和与该扩展关联的mime-type,因此:
$UploadExts=数组('gif'=>'image/gif','jpeg'=>'image/jpeg',“jpg”=>“image/jpeg”,'png'=>'image/png',“xxx”=>“yyyy/zzz”);
对于PmWiki已经知道的类型,没有必要在这里重复它们(上传.php脚本将PmWiki的默认值添加到管理员提供的任何内容中)。另请参见食谱:上传类型用于其他类型。
其他文件大小限制
还有其他影响上传文件大小的因素。在Apache 2.4中,有一个LimitRequestBody(限制请求正文)控制发布的任何内容(包括文件上传)的最大大小的指令。Apache默认为无限大小。然而,一些Linux发行版(例如,Red Hat Linux)将发布限制在512K,因此可能需要更改或增加。(通常这些设置在httpd.conf网址配置文件或中的文件/等/httpd/conf.d.)
使用Apache 2.0.x的Red Hat 8.0/9.0出现问题,Apache下出现错误“Requested content-length of 670955 is larger than the configured limit of 524288”,浏览器中将显示“Page not found”。尝试使用PHP进行上述设置没有改变,但在Red Hat 8.0/9.0上有一个附加的PHP配置文件/etc/httpd/conf.d/PHP.conf,增加“LimitRequestBody 524288”行上的数字可以解决此问题。
PHP本身对文件上传有两个限制(通常位于/等/php.ini
). 第一个是上传最大文件大小
参数,默认设置为2MB。第二个是最大后尺寸
,默认设置为6MB。
有了变量(PmWiki的最大文件大小、Apache的请求大小限制和PHP文件大小参数),上传的文件大小将是三个变量中最小的。
上传文件的密码保护
为页面(和组)设置读取密码将阻止通过页面查看或访问附加文件,但要阻止直接访问文件位置(上传/目录),可以执行以下操作:
请参见食谱:安全附件附件的安全问题
其他注意事项
- 如果上传似乎不起作用,请确保PHP安装允许上传。这个php.ini公司文件(通常/etc/php.ini文件或/usr/local/lib/php.ini)应该有
file_uploads=开
- 中的另一个错误源php.ini公司文件是未定义的上传tmp_dir。只需将此变量设置为临时目录,例如。
upload_tmp_dir=/tmp
请注意,如果更改此值,通常必须重新启动httpd。检查服务器是否允许上传的另一种方法是设置$EnableDiag(启用诊断)
至1英寸配置.php,然后设置?action=URL上的phpinfo。“文件上载(_U)
“变量的值必须为1(如果它显示”无价值
“,这意味着它关闭了)。
常见问题解答
如何禁止上传特定类型的文件?
下面是要添加到您的本地/config.php文件以禁止上载.zip文件或无扩展名的文件:
$UploadExtSize['zip']=0;#不允许上传.zip文件$UploadExtSize[“”]=0;#不允许没有扩展名的文件
如何将上传附加到单个页面或整个站点,而不是按以下方式组织它们wiki组?
使用$上传前缀Fmt
变量(另请参见菜谱:UploadGroups配方)。
$UploadPrefixFmt='/$FullName';#每页,在组中。名称目录$UploadPrefixFmt=“/$Group/$Name”;#每页,在具有Name子目录的Group目录中$UploadPrefixFmt='';#现场范围
对于$UploadDirQuota(上传目录配额)
-你能提供一些单位和数字吗?规范是以字节还是比特表示的?100K的号码是多少?1梅格?1吉?1 TB?
单位以字节为单位。
$UploadDirQuota=100*1024;#将上传限制为100KiB$UploadDirQuota=1000*1024;#将上传限制为1000KiB$UploadDirQuota=1024*1024;#将上传限制为1MiB$UploadDirQuota=25*1024*1024;#将上传限制为2500万B$UploadDirQuota=2*1024*1024x1024;#将上传限制为2GiB
有没有办法允许文件名使用Unicode或其他字符?
是的,请参阅$上传名称字符
附件列表存储在哪里?
它是由(:附件:)标记。
使用下载二进制文件,如图片或ZIP存档$EnableDirectDownload(启用直接下载)
=0;
有时会导致文件损坏,为什么?
某些配方或本地配置可能会在文件之前输出某些内容。如果PHP文件末尾带有结束标记“?>”,后面有一些文本或空白,则可能会发生这种情况。建议从本地文件和烹饪书文件中删除这些结束标记。
或者,在文件数据之前可能会出现一些PHP警告或消息。在类Unix系统上,可以使用以下命令查看文件less-f-L文件.ext
并查看前几个字符或行。请参见故障排除如何跟踪错误/警告的来源。