MS RFC 131:允许MapCache二级维值中的文件路径

日期

2020-05-20

作者

Jérome Boué

联系

jbo-ads@mailo.com

状态

采用

最后更新

2020-08-06

版本

MapCach 1.12

概述

MapCache中的维值主要作为一种手段,通过使用模板机制来标识存储或获取切片的缓存:“{dim}”或“{dim: 暗淡的名称 }“(请参阅 存储维度使用多个sqlite数据库文件 )。在此模式中,尺寸值是文件名或目录名的一部分。

目前,文件路径(目录层次结构的一部分,即包含 / or . 字符)作为MapCache中的尺寸值被禁止。这可以防止恶意客户端潜在地浏览服务器的文件系统。

然而,从地理图像提供商的角度来看,能够在任意文件系统层次结构中组织缓存将是一个很好的功能。

为了增加服务器端的灵活性,该RFC建议允许在不影响服务器安全性的情况下有限地使用维值中的文件路径。

顺便说一句,这个RFC最初的需求出现在SQLite缓存上。因此,此功能仅适用于该缓存类型。

建议的解决方案

从初步讨论到 [mapserver-dev] mailing list ,出现了两个主要原则:

  1. 不允许用户直接提供路径;相反,提供关键字到路径的映射。

  2. 仅允许相对于 root-dimension-path ,以便只能访问文件系统的受控子集;禁止在维度路径中使用“../”。

第一原则:关键字到路径的映射

事实上,MapCache中已经提供了这一功能:这就是所谓的 二级尺寸 机械装置。

因此,建议的解决方案应该只允许具有第二级维度的路径。取尺寸值时,通过对尺寸类型的具体检查来实现。

对于不允许在尺寸值中使用路径的尺寸,当前行为适用:替换‘’。和“/”字符之间的“#”字符。

第二条原则:将维度路径限制为文件系统的子集

这个 root-dimension-path MapCache中已经提供了一种机制:模板应用于缓存配置中指定的硬编码路径。

此外,为了明确特定的缓存支持路径作为维值,在缓存配置级别引入了一个属性。

<cache type="sqlite"
       allow_path_in_dim="yes"
       name="foo">
    <!-- ... -->
    <dbfile>/path/to/{grid}/{dim}/{tileset}/{z}/{x}-{y}.sqlite3</dbfile>
 </cache>

此外,建议的解决方案应通过将该字符串替换为安全字符(如‘#’)来实现“../”清理。

在不明确允许维值中包含路径的缓存上,当前行为适用:替换‘’。和“/”字符之间的“#”字符。

文档更新

小节 使用多个sqlite数据库文件 应予以修改。

实施详情

仅限 lib/cache_sqlite.c 受到了影响。

向后兼容性

由于这是一项新功能,因此不需要向后兼容。

投票历史

与+1一起采用,来自JeffM、SethG、TomK、Mikes、EvenR、DanielM、SteveL、JeromeB