我今天早上发布了 Datasette 0.64。此版本主要是对以下认识的响应:如果 Datasette 实例配置为启用来自不受信任用户的任意 SQL 查询,则在加载 SpatiaLite 扩展的情况下运行 Datasette 是不安全的。
以下是完整引用的发行说明:
- 如果您使用 SpatiaLite,Datasette 现在强烈建议不要允许任意 SQL 查询。 SpatiaLite 包含可能导致 Datasette 服务器崩溃的 SQL 函数。有关详细信息,请参阅SpatiaLite 。
- 新的default_allow_sql设置,提供了一种更简单的方法来禁用最终用户执行的所有任意 SQL:
datasette --setting default_allow_sql off
。另请参阅控制执行任意 SQL 的能力。 ( #1409 )- 使用 SpatiaLite 构建位置到时区 API是一个新的 Datasette 教程,展示了如何安全地使用 SpatiaLite 创建位置到时区 API。
- 关于如何调试加载 SQLite 扩展的问题的新文档。无法加载扩展时显示的错误消息也得到了改进。 ( #1979 )
- 修复了可访问性问题:表格过滤器表单中的
<select>
元素现在在当前聚焦时显示轮廓。 ( #1771 )
SpatiaLite 的问题
Datasette 允许任意 SQL 执行作为核心功能。它需要一系列步骤才能安全地提供:数据库连接以只读模式打开,它对 SQL 查询施加严格的时间限制,并且 Datasette 设计为在容器中运行以提供进一步的保护层。
SQLite 本身是实现此功能的出色平台:它具有一组默认功能,可以很好地支持此功能,并受到传奇般的全面测试套件的保护。
SpatiaLite是一个长期运行的 SQLite 第三方扩展,它为 SQLite 添加了一系列令人眼花缭乱的附加功能——其中大部分围绕 GIS,但也有一大堆额外功能。它包括调试例程、XML 解析器,甚至它自己的存储过程实现!
不幸的是,并非所有这些功能都可以安全地暴露给不受信任的查询——即使对于以只读模式打开的数据库也是如此。
在确定了可能导致 Datasette 实例崩溃的函数之后,我决定 Datasette 应该强烈建议不要以不受保护的方式公开 SpatiaLite。
除了新文档之外,我还添加了一个我计划了一段时间的功能:一个用于完全禁用任意 SQL 查询的简单设置:
datasette --setting default_allow_sql off
在 0.64 之前,您可以通过将以下行添加到metadata.json文件来实现相同的目的:
{ “allow_sql” :假 }
或者在metadata.yml
中:
allow_sql :假
新设置实现了相同的目的,但更明显,甚至可以轻松应用于不使用元数据的 Datasette 实例。
新的 SpatiaLite 教程
该文档现在建议运行 SpatiaLite 实例,并使用 Datasette 的固定查询功能实现预先批准的 SQL。
为了帮助阐明这是如何工作的,我决定在Datasette 官方系列教程中发布一个新条目:
这是我在 2017 年首次写的教程的更新版本。
新教程现在包含有关 Chris Amico 的datasette-geojson-map插件、SpatiaLite 点多边形查询、多边形交集查询、空间索引以及如何使用simplify()
函数将巨大多边形缩小到更大尺寸的材料实用显示在地图上。
我对这个新教程非常满意。它不仅展示了运行 SpatiaLite 的安全方式,而且还展示了使用 Datasette 创建和部署自定义 API 的强大模式。
可以在此处访问生成的 API:
https://timezones.datasette.io/timezones
它托管在Fly上,使用其 1.94 美元/月的实例大小和 256MB 的 RAM – 很容易强大到足以托管此类应用程序。
我还更新了datasette-publish-fly插件,以便更轻松地部署禁用 SQL 执行的实例,请参阅1.3 发行说明。
原文: http://simonwillison.net/2023/Jan/9/datasette-064/#atom-everything