VALIDATION

目录

介绍

因为 运行时替换 影响映射文件的潜在敏感区域,如数据库列和文件名,必须使用模式验证(从6.0版开始)。

备注

自4.10版以来,类似的验证模式机制可用于变量替换,但随后它是可选的。然后在中提供了%myvar%的模式 METADATA 使用“myvar_验证_模式”。

备注

此外,强烈建议您查看 MAP= 通过设置来调用MapServer可执行文件 MS_MAP_PATTERNMS_MAP_NO_PATH 或者隐藏 MAP= 参数,如本文档中所建议的 限制 Mapfile 访问 。中列出了保护服务器安全的所有可能环境变量 环境变量

模式验证使用正则表达式,这些表达式是描述如何将字符串与模式进行比较的字符串。您的系统正则表达式的确切功能可能会有所不同,但是您可以通过谷歌搜索“正则表达式教程”来找到大量的一般信息。

从MapServer 5.4.0开始,首选机制是 VALIDATION LAYER 定义。这和旧的稍有不同 METADATA VALIDATION 块可用于 CLASSLAYERWEB .

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中找不到该参数,则将应用该值。你可以通过在里面提供特殊的条目来做到这一点。 CLASSLAYERWEB 验证块:

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

而应使用另一个变量名,如 codemyid 。例如:

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