限制 Mapfile 访问

作者

斯蒂芬·利姆

联系

Gmail.com上的sdlim.

作者

杰夫麦克纳

联系

jmckenna在gatewaygeomatics.com

最后更新

2021-06-03

默认情况下,MapServer CGI将很乐意尝试处理它被要求处理的任何映射文件。虽然这在开发环境中可能是可取的,但对于面向公众的安装是不可接受的。MapServer支持使用特定的 环境变量 ,在Web服务器层设置,以限制访问。从MapServer 7.6.3版本开始,您将 必填项 使用这些环境变量(组合)来保护您的安装;对于较早的MapServer版本,这些环境变量是 强烈推荐

警告

这个漏洞 CVE-2021-32062 已通过MapServer 7.6.3版本修复,方法是要求使用本MapServer文档中描述的环境变量。

备注

环境变量仅由MapServer CGI引用,而不由MapScript以任何方式使用。

关键环境变量

参见

环境变量

参见

关联的 Pull Request 对于7.6.3版本

小技巧

在线工具 RegExr & RegEx101 非常适合测试正则表达式。

MS_MAP_BAD_PATTERN

7.6.3 新版功能.

如果设置,此环境变量将被解释为正则表达式,用于通过指定要避免的有问题的字符序列来测试CGI映射参数的值。如果值匹配,则会生成错误。默认情况下,所有MapServer安装(从7.6.3开始)都为设置硬编码值 MS_MAP_BAD_PATTERN 的:

[/\\]{2}|[/\\]?\\.+[/\\]|,

因此,它不允许在映射值中使用“/../”或“//”。

备注

对于Windows用户,MS4W使用PCRE正则表达式库(它需要略有不同的正则表达式语法),因此所有未来的MS4W版本都将包含以下默认设置 MS_MAP_BAD_PATTERN 已启用(不允许映射值中有“/../”或“//”):

[\/\\\\]{2}|[\/\\\\]?\.{2,}[\/\\\\]|,

有关更多信息,请参见 Securing your MS4W Installation

MS_MAP_NO_PATH

5.4.0 新版功能.

如果设置,则此环境变量会将CGI映射参数的值限制为由其他环境变量显式定义的一组经过管理(准备)的映射文件。如果可能,这是保护映射文件访问安全的推荐方法。

备注

基于 Mapfile 的环境变量(例如 MS_MAPFILE )可以在不设置MS_MAP_NO_PATH的情况下使用。

MS_MAP_PATTERN

5.4.0 新版功能.

如果设置,此环境变量将被解释为用于测试CGI映射参数值的正则表达式。如果值不匹配,则会生成错误。

必须小心构建正则表达式,以限制对特定受信任目录的访问,并限制路径遍历:。请参阅 环境变量 示例指南。

备注

如果已定义,则MS_MAP_PROPERT变量仅适用于尚未通过环境变量定义的映射文件。

设置环境变量

设置环境变量的机制因Web服务器而异,但都提供了该功能。(正则表达式功能集可能因操作系统和版本而异)

  • 阿帕奇 --https://httpd.apache.org/docs/current/env.html

    阿帕奇的 SetEnv 指令(可通过 mod_env 模块)允许您使用单个命令设置Apache conf文件中的环境变量:

    • Unix用户 可以在Apache中设置以下表达式,以将映射文件限制为 /opt/mapserver 目录和子目录:

      SetEnv MS_MAP_PATTERN "^\/opt\/mapserver\/([^\.][_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
      

      警告

      在此文档过程中的测试过程中,上述MS_MAP_Pattern在旧的Debian Wheezy服务器上失败,路径如下 MAP=/opt/mapserver/ogc-demos/wms.map (‘ogr-demos’文件夹中的破折号引起了很大的悲痛),即使破折号是在提供的表达式字符集中转义的。

      因此,运行较早的regex库的用户应该改用以下代码,这样可以将破折号放在表达式的字符集的开头,从而避免转义问题:

      SetEnv MS_MAP_Pattern“^/osgeo/mapserver/( [^.] [-_A-Za-z0-9.] +/{1})*( [-_A-Za-z0-9.] +.(地图))$“

    • Windows Apache/MS4W users 我可以在Apacheconf文件中设置以下表达式,以将可能的map=路径限制为公共 C:/ms4w/apps/ 目录(所有MS4W Mapfile 和应用程序所在的目录),允许编码的URL,允许“。或MAP=路径中的“_”或“-”,但不允许“..”目录遍历:

      SetEnv MS_MAP_PATTERN "^(C:)?\/ms4w\/apps\/((?!\.{2})[_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
      
  • 恩吉克斯 --http://nginx.org/en/docs/ngx_core_module.html#env

  • IIS --https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/applicationpools/add/environmentvariables/