如何防御针对GIS地理位置数据的SQL注入_对经纬度参数进行格式化检测

老静大大_5239

老静大大_5239

2026-05-01

753人浏览

原创

geoserver sql视图中经纬度参数不能直接拼接,因viewparams是纯字符串替换,易导致sql注入;须校验范围(经度-180~180、纬度-90~90)、过滤非法字符并强转浮点,或改用cql_filter替代。

如何防御针对gis地理位置数据的sql注入_对经纬度参数进行格式化检测

GeoServer SQL视图中经纬度参数为什么不能直接拼接

因为 viewparams 的替换机制是纯字符串替换,不经过任何预编译或类型校验。当你写 SELECT * FROM points WHERE ST_Contains(geom, ST_Point(%lon%, %lat%)),GeoServer 会把 %lon% 和 %lat% 原样替换成 URL 传入的值,然后发给 PostgreSQL 执行。如果攻击者传入 lon=100; DROP TABLE points;--,最终执行的就是 ST_Point(100; DROP TABLE points;--, ...) ——语法错误只是表象,更危险的是绕过语法检查的布尔盲注或联合查询。

对 lon 和 lat 参数做数值范围与格式校验

经纬度有明确的数学边界:lon 必须在 [-180, 180],lat 必须在 [-90, 90],且必须是合法浮点数(不能含字母、分号、括号、注释符)。仅靠正则过滤不够,需组合校验:

  • 用 regexp_replace('%lon%', '[^0-9.-]', '', 'g') 清除非法字符,但注意保留小数点和负号
  • 再用 CAST(... AS DOUBLE PRECISION) 强转并捕获异常(PostGIS 中可配合 COALESCE 或子查询兜底)
  • 最终在 WHERE 条件中显式限定范围:AND %lon% BETWEEN -180 AND 180 AND %lat% BETWEEN -90 AND 90

示例安全 SQL 视图片段:

EasySub – AI字幕生成翻译工具
EasySub – AI字幕生成翻译工具

EasySub是一款在线视频字幕生成、字幕编辑和多语言翻译工具。

下载
SELECT * FROM points 
WHERE ST_Contains(geom, ST_Point(
  CAST(regexp_replace('%lon%', '[^0-9.-]', '', 'g') AS DOUBLE PRECISION),
  CAST(regexp_replace('%lat%', '[^0-9.-]', '', 'g') AS DOUBLE PRECISION)
))
AND CAST(regexp_replace('%lon%', '[^0-9.-]', '', 'g') AS DOUBLE PRECISION) BETWEEN -180 AND 180
AND CAST(regexp_replace('%lat%', '[^0-9.-]', '', 'g') AS DOUBLE PRECISION) BETWEEN -90 AND 90

用 CQL_FILTER 替代 viewparams 处理空间条件

这是最推荐的替代路径:CQL 过滤器由 GeoServer 内部解析,不走 SQL 字符串拼接,天然免疫注入。只要你的空间查询能表达为标准 OGC CQL 语法,就应优先使用它。

  • 危险写法:&viewparams=lon:116.4;lat:39.9 + 拼接 SQL
  • 安全写法:&CQL_FILTER=CONTAINS(geom, POINT(116.4 39.9))
  • 注意:POINT 坐标顺序是 LON LAT(WKT 标准),不是 LAT LON
  • CQL 不支持动态函数调用(如 ST_Buffer),复杂空间运算仍需 SQL 视图,但基础点查、框选、相交完全够用

PostGIS 层面加一层 CAST + COALESCE 防崩溃

即使做了前端校验,也不能假设所有请求都来自可信客户端。在 SQL 视图里用 COALESCE 和 NULLIF 给类型转换加保险:

  • NULLIF(regexp_replace('%lon%', '[^0-9.-]', '', 'g'), '') 防空字符串转浮点失败
  • COALESCE(CAST(... AS DOUBLE PRECISION), 0.0) 提供默认值,避免整个查询因单个参数失败而中断
  • 但注意:默认值可能引入逻辑漏洞(比如用 0.0 当作有效经度),所以必须配合显式范围判断(上一条中的 BETWEEN)

真正容易被忽略的是——GeoServer 的 SQL 视图错误日志默认不记录原始 viewparams 值,出问题时你看到的只是 PostgreSQL 报错,却不知道攻击者到底传了什么。建议在生产环境开启 GEOSERVER_LOG_LEVEL=DEBUG 并过滤 ViewParams 关键字,否则连溯源都困难。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4243

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6161

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3003

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6120

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8261

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1130

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

992

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发基础之数据库篇(PDO)
PHP开发基础之数据库篇(PDO)

共10课时 | 2.3万人学习