MS RFC 56:加强对 Mapfile 和模板的访问控制¶
- 日期
2009/03/24
- 作者
丹尼尔·莫里塞特
- 联系方式
在mapgears.com的dmorissette
- 作者
史蒂夫·莱姆
- 联系方式
明尼苏达州第纳尔的史蒂夫·莱姆
- 最后编辑
2009/03/26
- 状态
通过并实施(2009/03/26)
- 版本
MapServer 5.4.0、5.2.2和4.10.4。
概述¶
通过在不受信任的目录中创建 Mapfile 或模板,可能会使用MapServer 5.2.1及更高版本访问任意文件。
该RFC提出了一种机制来加强对 Mapfile 和模板的访问控制,并限制泄漏任意文件内容的风险。
新的访问控制机制将在MapServer 5.4.0、5.2.2和4.10.4中实施和发布。
技术解决方案¶
将建立以下机制:
强制要求 Mapfile 开头的map关键字和符号集开头的symbolset关键字。
在所有MapServer模板的开头需要一个魔力字符串
使用环境变量控制和限制mapserv cgi对mapfile的访问:
MS_MAP_PATTERN
MS_MAP_NO_PATH
以上每一点在下面的章节中都有更详细的描述。
强制要求使用map和symbolset关键字¶
map和symbolset关键字分别在mapfiles和symbolset的开头是可选的。
通过这种更改, Mapfile 的第一行需要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的所有mapfile路径匹配。
如果未设置ms_map_模式,则可以加载任何.map文件。
例如,使用apache的setenv指令将 Mapfile 限制为/opt/mapserver/目录和子目录:
SetEnv MS_MAP_PATTERN "^/opt/mapserver/"
ms_map_no_path 环境变量¶
可选的ms_map_no_path环境变量可以通过mod_env或其他Web服务器等效设置为任何值,以禁止在map=中使用显式路径。URL参数。将ms-map-no-u路径设置为 any value 强制在mapserv cgi urls中使用map=<env_variable_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。