微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法防止用户在 PosgreSQL 中进行洪水插入?是否有某种速率限制?

如何解决有没有办法防止用户在 PosgreSQL 中进行洪水插入?是否有某种速率限制?

作为 sql 注入预防的一部分,我已经撤销了使用连接的用户的 DELETE 和 UPDATE 权限。这样,即使不良代码允许 sql 注入,攻击者也无法破坏数据的完整性。

现在只剩下插入了。例如。攻击者可以泛洪插入特定表、创建脏数据库或使用泛洪 INSERT 将其关闭,从而可能关闭硬盘和运行 Postgresql 的服务器。已为该用户撤销所有 DDL 和 DCL。

所以,我的问题是:是否可以防止泛洪插入、限制特定连接/会话/执行的速率、在上述期间每 5-10 秒尝试插入超过 1 行。

泛洪插入我的意思是这样的:

insert into cars (id,name)
select id,name from cars

-- or if we imagine that id is auto-number.
insert into cars (name)
select name from cars

用户可以用一行简单的行执行整个表的复制,下次执行时将其加倍。

在多个地方,我已将保护功能/程序的权利读为保护,但对 INSERT/DELETE/UPDATE 采取权利,但我不知道如何去做,一旦您撤销对 INSERT 的权利,该程序也不会运行,因为它是由同一用户运行的。

所以我不太确定您是如何阻止脚本/查询执行的,但是您授予函数/过程执行权限?

如果可以的话,有人能给我一个实际的例子吗?你会怎么做这样的事情?

“限制插入的可用 RAM”这一行的答案是不可接受的。

谢谢,

解决方法

您的评论之间有一些相互矛盾的要求:

我需要在单个语句限制中插入的行数

以及您的问题:

限制特定连接/会话/执行尝试每 5-10 秒插入超过 1 行

没有外部工具无法实现“速率限制”,但是“单语句限制”部分可以通过语句级触发器来实现。

函数检查插入的行数:

create function limit_insert()
 returns trigger
as
$$
declare
  l_count bigint;
begin
  select count(*)
    into l_count
  from inserted;
  if l_count > 10 then
    raise 'Too many rows inserted!';
  end if;
  return null;
end;
$$
language plpgsql;

触发器定义为:

create trigger limit_insert_rows_trigger
  after insert on the_table
  referencing new table as inserted
  for each statement execute function limit_insert();

注意触发器函数可用于任何表。

,

保留一个包含 user_id 或 session id、event_name 和 event_time 的表 user_event 怎么样

select max(event_time) from user_event where user_id = :user_id 和 event_name = 'insert_car';

如果 event_time

显然这是伪代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。