VALIDATION¶
介绍¶
因为 运行时替换 影响映射文件的潜在敏感区域,如数据库列和文件名,必须使用模式验证(从6.0版开始)。
备注
自4.10版以来,类似的验证模式机制可用于变量替换,但随后它是可选的。然后在中提供了%myvar%的模式 METADATA 使用“myvar_验证_模式”。
备注
此外,强烈建议您查看 MAP= 通过设置来调用MapServer可执行文件 MS_MAP_PATTERN 或 MS_MAP_NO_PATH 或者隐藏 MAP= 参数,如本文档中所建议的 限制 Mapfile 访问 。中列出了保护服务器安全的所有可能环境变量 环境变量 。
模式验证使用正则表达式,这些表达式是描述如何将字符串与模式进行比较的字符串。您的系统正则表达式的确切功能可能会有所不同,但是您可以通过谷歌搜索“正则表达式教程”来找到大量的一般信息。
从MapServer 5.4.0开始,首选机制是 VALIDATION LAYER 定义。这和旧的稍有不同 METADATA VALIDATION 块可用于 CLASS , LAYER 和 WEB .
VALIDATION
# %firstname% substitutions can only have letters and hyphens
'firstname' '^[a-zA-Z\-]+$'
# %parcelid% must be numeric and between 5 and 8 characters
'parcelid' '^[0-9]{5,8)$'
# %taxid% must be two capital letters and six digits
'taxid' '^[A-Z]{2}[0-9]{6}$'
END
如果相同的键出现在多个验证块中,那么更专业的块中的键将覆盖更通用的块中的键。所以 CLASS 重写 LAYER 哪些超越 WEB .
如果URL中没有提供默认值¶
运行时替换机制通常会创建语法错误的映射文件,如果调用URL中没有提供替换参数,则几乎总是语义错误的映射文件。
由于版本5.6,您可以为任何替换参数提供默认值,如果在URL中找不到该参数,则将应用该值。你可以通过在里面提供特殊的条目来做到这一点。 CLASS , LAYER 或 WEB 验证块:
VALIDATION
'default_sound' 'yes'
'default_nseats' '5'
'default_multimedia' 'yes'
END
在本例中,将创建映射文件,就像URL包含“&sound=yes&nseats=5&multimedia=yes”
CLASS 重写 LAYER 哪些超越 WEB.
METADATA VALIDATION 但从MapServer 5.4.0开始,这已被弃用。
使用命令行测试¶
您可以在命令行进行测试,从而无需使用Web服务器即可测试运行时替换映射文件,并使用mapserv实用程序,例如:
mapserv -nh "QUERY_STRING=map=D:\ms4w\apps\filter-validation\filter-validation.map&mode=map&layers=all&nseats=10" > ttt.png
过滤实例¶
您可以使用运行时替换来更改过滤器中的值。例如,您的过滤器可以这样写:
FILTER ("multimedia='%multimedia%' and seats >= %nseats% and Sound= '%sound%')
然后(假设您使用的是CGI接口),您可以使用用户以HTML格式定义的值传入名为multimedia、nseats和sound的变量。
您必须在这些变量上定义验证表达式,以防止无意中将SQL提交到服务器。在该层中,您将执行以下操作:
VALIDATION
'multimedia' '^yes|no$'
'sound' '^yes|no$'
'nseats' '^[0-9]{1,2}$'
END
前两个将多媒体和声音的值限制为“是”或“否”。第三个将NSEAT的值限制为2位整数。
备注
注意不要使用专门命名的变量 id 因为这将导致错误,例如:
msCGILoadForm(): Web application error. Parameter 'id' value fails to validate
而应使用另一个变量名,如 code 或 myid 。例如:
LAYER
..
VALIDATION
"code" "[0-9]"
END
..
FILTER ("[reg_code]" IN "%code%")
...
END # Layer
..并将其称为:https://xxx.xx/cgi-bin/mapserv?map=xxx.map&mode=map&code=12,13
表达式示例¶
您还可以使用运行时替换来更改类表达式中的值,例如 EXPRESSION ([year] < %year%) 。
同样,您必须在这些变量上定义验证表达式,以防止无意中向服务器提交请求。在该层中,您将执行以下操作:
VALIDATION
'year' '^[0-9]{4}$'
'default_year' '1976'
END
第一个将可能的值限制为4位数字,每个数字有效。第二个设置缺省值。
整个层可能显示为:
LAYER
NAME 'yearly-data'
TYPE POINT
CONNECTIONTYPE OGR
CONNECTION "data.vrt"
VALIDATION
'year' '^[0-9]{4}$'
'default_year' '1976'
END #validation
STATUS ON
CLASS
NAME "Passed"
EXPRESSION ([year] < %year%)
STYLE
SYMBOL "circlef"
COLOR 0 0 255
SIZE 4
END # STYLE
END # CLASS
CLASS
NAME "Current"
EXPRESSION ([year] = %year%)
STYLE
SYMBOL "circlef"
COLOR 255 0 0
SIZE 4
END # STYLE
END # CLASS
END # LAYER
小技巧
对于表达式语法,请务必检查 ogrinfo 数据层上的响应,以查看OGR/GDAL是将数据值作为整数还是字符串读取,例如:
ogrinfo data.vrt data -summary
using driver `OGR_VRT' successful.
Layer name: data
Geometry: Point
Feature Count: 3590
Extent: (136.852100, -43.533900) - (153.550600, -17.253900)
Layer SRS WKT:
...
year: Integer (0.0)
从上面我们可以看到 year 被OGR读取为数字,因此我们的表达式应该检查两边都有数字,例如 EXPRESSION ([year] = %year%) 。或者,如果将该字段视为字符串,则表达式可能为: EXPRESSION ("[year]" = "%year%")
您可以在命令行中对此进行测试,从而允许您使用mapserv实用程序测试运行时替换映射文件,例如:
mapserv -nh "QUERY_STRING=map=D:\ms4w\apps\validation-expression\validation.map&mode=map&year=1976" > out.png