MS RFC 56:加强对映射文件和模板的访问控制¶
- 作者
丹尼尔·莫里塞特
- 联系
在mapgears.com的dmorissette
- 作者
史蒂夫·莱姆
- 联系
明尼苏达州第纳尔的史蒂夫·莱姆
- 作者
杰夫麦克纳
- 联系
jmckenna在gatewaygeomatics.com
- 状态
通过并于2009-03-26实施
- 版本
MapServer 5.4.0、5.2.2和4.10.4。
- 最后更新
2021-03-27
概述¶
通过在不受信任的目录中创建映射文件或模板,可能会使用MapServer 5.2.1及更高版本访问任意文件。
该RFC提出了一种机制来加强对映射文件和模板的访问控制,并限制泄漏任意文件内容的风险。
新的访问控制机制将在MapServer 5.4.0、5.2.2和4.10.4中实施和发布。
备注
所有可用的环境变量,包括 MS_MAPFILE 和此处描述的那些,可以选择性地设置它们以隐藏 MAP= 参数)都列在文档中: 环境变量 。
技术解决方案¶
将建立以下机制:
强制要求映射文件开头的map关键字和符号集开头的symbolset关键字。
在所有MapServer模板的开头需要一个魔力字符串
使用环境变量控制和限制mapserv cgi对mapfile的访问:
MS_MAP_PATTERN
MS_MAP_NO_PATH
以上每一点在下面的章节中都有更详细的描述。
强制要求使用map和symbolset关键字¶
map和symbolset关键字分别在mapfiles和symbolset的开头是可选的。
通过这种更改,映射文件的第一行需要map关键字,而符号文件的第一行需要symbolset关键字。
如果缺少关键字,则分析器将拒绝该文件。
在所有MapServer模板的开头需要一个魔力字符串¶
通过这种更改,模板的第一行必须包含“mapserver template”魔术字符串,该字符串可以由模板格式的注释分隔符包围,以便于模板编辑(参见下面的示例)。模板文件的第一行将自动从模板中删除,并且不会包含在mapserver输出中。
如果找不到magic字符串,那么mapserver将拒绝该模板。
HTML模板示例:
<!-- MapServer Template -->
<html>
<head>...</head>
<body>
...
</body>
</html>
XML模板示例:
<!-- MapServer Template -->
<?xml version="1.0" encoding="UTF-8" ?>
<rootElement>
...
</rootElement>
geojson模板示例:
// MapServer Template
[resultset layer=foo] {
"type": "FeatureCollection",
"features": [
[feature trim=',']
{
"type": "Feature",
"id": "[id]",
"geometry": {
"type": "PointLineString",
"coordinates": [
{
"type": "Point",
"coordinates": [[x], [y]]
}
]
},
"properties": {
"description": "[description]",
"venue": "[venue]",
"year": "[year]"
}
},
[/feature]
]
}
[/resultset]
ms-map-pattern环境变量¶
可选的 MS_MAP_PATTERN 通过mod_env或其他Web服务器等效项设置的环境变量可用于指定一个正则表达式,该正则表达式必须与传递到mapserv CGI的所有映射文件路径匹配。
如果 MS_MAP_PATTERN 未设置,则可以加载任何.map文件。
可以使用ApacheSetEnv指令将映射文件限制到特定目录和子目录。
Unix用户 可以在Apache中设置以下表达式,以将映射文件限制为 /opt/mapserver 目录和子目录:
SetEnv MS_MAP_PATTERN "^\/opt\/mapserver\/([^\.][_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
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))$"
备注
MS4W用户可以在https://ms4w.com/README_INSTALL.html#securing-your-ms4w-installation上查看具体的示例
ms_map_no_path环境变量¶
可选的 MS_MAP_NO_PATH 可以通过mod_env或其他Web服务器等效项将环境变量设置为任何值,以禁止在map=...中使用显式路径。URL参数。设置 MS_MAP_NO_PATH 至 任何价值 强制在mapserv CGI URL中使用map=<env_ariable_name>机制。
如果未设置此变量,则不会发生任何更改,并且mapserv cgi仍然通过map=接受显式文件路径。URL参数。
例如,在apache的httpd.conf中设置set ms_map_nopath和一些mapfile路径:
SetEnv MS_MAP_NO_PATH "foo"
SetEnv MY_MAPFILE "/opt/mapserver/map1/mymapfile.map"
……然后调用mapserv cgi必须为map=使用环境变量。参数:
http://localhost/cgi-bin/mapserv?map=MY_MAPFILE&mode=...
向后兼容性问题¶
map和symbolset关键字必须添加到任何尚未包含它们的mapfile和symbolset中。
必须更新所有MapServer模板,以便在第一行包含“MapServer模板”魔力字符串。
新的环境变量是可选的,不会对不使用它们的现有应用程序产生影响。
文件冲击¶
mapserver.h
maptemplate.c
mapserv.c
票据ID¶
相关安全票:
投票历史¶
2009年3月26日,丹尼尔、汤克、佩里克森、杰夫姆、史蒂文、阿塞菲、史蒂文和塔玛斯通过+1。