GeoServer的SQL Views详解

GeoServer的SQL Views详解

众所周知,Geoserver支持发布shp,postgis数据库数据。通过各种扩展,可以发布oracle spatial,myspatial数据库数据。在日常应用中发现使用者只是简答的发布了数据库的表,还有视图。而Geoserver的SQL Views能做的更多,体现如下:

  • 数据库view可以在geoserver中当做表完全一样的发布,而Geoserver的SQLViews不仅能实现简单的查询发布,还能输入参数作为查询视图的条件。
  • geoserver的views可以发布数据库的存储过程或者function,执行更加复杂的逻辑操作与查询。
  • SQL Views是对数据库操作与查询的一个结果,不能使用wfs_t去操作它,但是wfs,wms都可以正常请求或者查询,具体见下文。

创建简单的SQL Views

这里写图片描述
这里写图片描述
这里创建了一个视图,从road表中只返回gid小于100的记录。
这里写图片描述
一般可以将数据库中主键比如gid设置为标识符,返回的图形要手动选择类型和srid。其他发布操作和其他的一模一样。

创建带查询条件的SQL Views

定义参数化Views

这里写图片描述
这里使用%%定义了两个参数,一个是下限low,一个是上限high。该视图用于传入这两个参数,查询结果。
这里写图片描述
点击 ‘从sql中猜想参数’,自动弹出以上内容。可以在默认值中赋值,后面正则表达式用于验证参数格式,防止sql注入,具体细节请学习正则表达式。任何不符合表达式规定的参数,验证都不会通过。(新手练习可以删除正则表达式内容,为空即可。避免因为正则不通过,导致视图使用不了)。发布的其他操作见上文。

使用参数化Views

在正常的wms的getMap请求中或者wfs的getFeature请求的url中加入viewparams参数,用来向视图传递参数值。上文中我们定义了两个参数,即low和high,下面看如何在请求中将参数传递给服务器。
正常getMap语句:

http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259&height=512&srs=EPSG:3857&format='image.png'

可传递参数的getMap

http://localhost:8090/geoserver/network/wms?service=WMS&version=1.1.0&request=GetMap&layers=network:road&styles=&bbox=1.31808014222456E7,3663612.77697468,1.32722445176114E7,3844254.1268673&width=259
&format=’image.png’
&viewparams=low:200;high:400

`正常wfs的请求url后加上viewparmas即可。
viewparams格式一般是viewparams=p1:v1;p2:v2;…可以加若干个参数。不同参数之间以;隔开,单个参数是键值对,即p1是参数名称,v1是参数值。
很明显如’,’,’ ;’都是特殊符号,用来区分参数的,可是有人要问,要是我的参数值是字符串,并且就有特殊符号怎么办?当然有办法–转义!转义符号是’\’。
比如,v1值比如是’adsf;sdfjsdf’,那么viewparams就要这么写viewparams=p1:’adsf\;sdfjsdf’,注意’,’,’:’都是特殊符号。

创建数据库的Function视图

在postgis中定义Function

CREATE OR REPLACE FUNCTION zj_showjgnsr(
IN p_idcode text, 
OUT swglm text,
OUT geom geometry)
RETURNS SETOF record AS
$BODY$
DECLARE
        sql text;
        rec record;
        the_geom geometry;

BEGIN   
    execute 'select geom from grid where idcode=$1' using p_idcode into the_geom; 
    for rec in execute 'select * from jgnsr where ST_Within(geom,$1)' using the_geom loop
            swglm:=rec.swglm;
            geom:=rec.geom;
        return next;
        end loop;
    return; 
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT;

这个function接受一个参数,根据该参数从grid表中查询出图形,然后以该图形为查询条件,查询这个jgnsr 表中与其相交的所有记录,并返回出去。function一般处理比较复杂的逻辑和过程。

发布Function

这里写图片描述
这里写图片描述

使用:发布成功之后,该视图图层和普通表在查询时几乎都是一模一样的操作,不同的是,表发布的图层可以通过wfs_t修改,而视图图层不可以。此外,视图图层有参数的,在正常请求的wfs,wms的url中要加上viewparams参数。

后记

我们发布了function是有geometry类型的,但实际上,任何数据库function都可以发布,哪怕返回值没有图形,geoserver完全也是能当做一个业务服务端耍耍的,而不仅仅是发布地理数据。
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
GeoServer存在SQL注入漏洞,攻击者可以通过构造畸形的过滤语法绕过GeoServer的词法解析,从而获取服务器中的敏感信息甚至可能获取数据库服务器权限。\[2\]具体的攻击示例是通过发送特定的HTTP请求来实现注入,其中包括了查询图层名称和属性名称的参数。\[3\] 为了防止SQL注入攻击,建议采取以下措施: 1. 及时更新GeoServer和相关组件的版本,以确保修复了已知的漏洞。 2. 对用户输入进行严格的验证和过滤,确保输入的数据符合预期的格式和类型。 3. 使用参数化查询或预编译语句来执行数据库操作,而不是直接拼接用户输入的数据。 4. 限制GeoServer的访问权限,只允许授权的用户或IP地址进行访问。 5. 监控和记录GeoServer的日志,及时发现异常行为并采取相应的应对措施。 通过采取以上措施,可以有效减少SQL注入攻击对GeoServer的威胁。 #### 引用[.reference_title] - *1* [GeoServer 存在 sql 注入漏洞](https://blog.csdn.net/murphysec/article/details/129278735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [GeoServer SQL注入漏洞复现(CVE-2023-25157)](https://blog.csdn.net/qq_41904294/article/details/131117123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值