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

投票历史

2009年3月26日,丹尼尔、汤克、佩里克森、杰夫姆、史蒂文、阿塞菲、史蒂文和塔玛斯通过+1。