pg-safeupdate

阻止全表操作

如果 活动角色 可以删除表行,则 DELETE 动词对客户端是允许的。以下是一个 API 请求,用于从假设的日志表中删除旧行

curl "http://localhost:3000/logs?time=lt.1991-08-06" -X DELETE

请注意,通过省略查询参数,很容易删除**整个表**!

curl "http://localhost:3000/logs" -X DELETE

这可能会意外发生,例如,将请求从 GET 切换到 DELETE。为了防止意外操作,请使用 pg-safeupdate PostgreSQL 扩展。如果在没有指定条件的情况下执行 UPDATE 或 DELETE,它会引发错误。要安装它,您可以使用 PGXN 网络

sudo -E pgxn install safeupdate

# then add this to postgresql.conf:
# shared_preload_libraries='safeupdate';

这并不能防止恶意行为,因为有人可以添加一个不影响结果集的 URL 参数。为了防止这种情况,您必须转向数据库权限,禁止错误的人员删除行,并在需要更精细的访问控制时使用 行级安全