MS RFC 44:将映射文件的URL修改还原到5.0之前的级别

日期

2008/08/19

作者

史蒂夫·莱姆

联系

明尼苏达州第纳尔的史蒂夫·莱姆

最后编辑

2008/08/19

状态

采用

MS RFC 31:从字符串加载MapServer对象 介绍了一种新的修改语法 mapfiles 通过URL。对象参数可以在mapfile片段中一起指定,从而更容易用更少的字符进行更改。同时,为了安全起见,删除了对一些参数的访问,特别是那些对mapfile解析没有进行值检查(主要是字符串)的参数。事后看来,我低估了开发人员使用该功能的程度。此RFC旨在恢复该功能,尽管考虑到了安全性。

提议的变更

目前,一些被广泛修改(和风险)的参数(如层模板和数据)可以通过URL进行更改。 if 设置正则表达式(例如templatePattern和dataPattern)以验证传入值。我建议对所有未检查的映射文件输入使用相同的方法。表示数字、颜色或具有值域的参数(例如,开/关/默认)将接受与从磁盘读取映射文件时相同的检查,因此应该是正常的。那些不需要特定验证值的值将在允许输入之前设置。例如,下面的层验证块定义了用于验证数据或筛选参数更改的模式。如果不存在相应的验证密钥,则无法更改该值。

将所有验证分组到一个新的验证块中,通过简化键名以匹配MapServer令牌名,可以方便地使用。该块的有效期为 MAPWEBLAYERCLASS 对象及其核心类型将是hashTableObj。地图级别的验证块对于为所有层或类应用模式很有用(因为只有1个Web对象,所以不需要依赖地图对象)。如果一个映射文件包含相似的层,并且相同的数据验证模式适用于所有层,那么这将节省大量重复。逻辑很简单:在层中查找验证模式,如果找不到,那么在映射级别查找验证模式,如果找不到,则不允许进行任何修改。

VALIDATION
data 'my pattern'
filter 'another pattern'
...
END

只有令牌源是URL时才会调用验证。映射文件或基于字符串的处理将不受影响。使用data/datapattern参数,可以在第2683行附近的mapfile.c中看到一个如何工作的示例。

受影响的文件

  • maplexer.l:所有参数(一些参数永远无法修改,如验证)都将更改为在url_variable lexer状态下识别;需要添加验证令牌

  • mapfile.h:添加验证令牌

  • mapfile.c:在通过url允许更改之前,所有非值检查参数都需要regex验证;识别验证令牌;使用mapfile写入验证哈希

  • mapserv.c:更新运行时替换和qstring验证的代码以检查验证哈希

受影响参数的完整列表将附在以下实施后说明中的本文件中。

映射文件更改

将识别新的验证令牌。

mapscript更改

一个也没有。MapScript已经有了一个用于HashTableObj管理的常规类。

向后兼容性问题

但是,参数datapattern和模板pattern将被弃用。有问题的对象(层和类)已经包含可用于此的验证块。

当前通过元数据支持URL运行时替换和qstring验证,这也将被弃用。运行时变量和单词“qstring”可以用作验证块中的键。

实施后注意事项

将开发一个如何涵盖这个主题和运行时替换的方法。

臭虫识别码

https://github.com/MapServer/MapServer/issues/2699

投票历史

+1石灰、木桥、莫里塞特、阿塞法