服务器端验证理念,寻找更好的方法来验证服务器端表单提交


Server side validation idea, searching for a better way to validate server side form submission

我想为我的网站创建一个强大的服务器端验证。特别是为了防止单个用户多次评论帖子。或者防止多次向数据库提交单个数据。为此,我认为如果单个用户在最后一次交互后被阻止 10 秒与数据库交互会更好。

1> 有没有其他方法可以防止此错误或来自服务器端的垃圾邮件保护?

2> 是否可以存储发布时间并通过匹配当前时间和数据库上的该时间来检查下一次交互可用性,或者有其他方法?

提前感谢您在这项微小的研究中帮助我!

使用雄辩事件,如果应该停止用户,则返回 false。

Comment::creating(function()
{
   // Check if the user has posted another comment within the last 10 seconds
   // e.g.:
   if (Comment::where('user_id', $userId)->where('created_at', '>=', Carbon::now()->subSeconds(10))->count()) return false;
});

特别是为了防止单个用户多次评论帖子。或者防止多次向数据库提交单个数据

在数据库层强制实施这一点很简单(假设您使用的是关系数据库)。你可以在PHP中构建逻辑来控制它 - 但它是复杂和不必要的。

还是来自服务器端的垃圾邮件保护?

是的,当然,您可以在服务器端验证数据 - 但您需要更具体地说明您要实现的目标。有很多工具,如Spamassassin和Akismet,它们非常复杂,经过良好测试,易于集成到PHP中。

我想为我的网站创建一个强大的服务器端验证。 特别是为了防止单个用户多次评论帖子。

数据库端的一般术语是约束。如果要将每个用户限制为每篇帖子一条评论,则可以使用主键约束或唯一约束。例如,如果您有一个名为"注释"的表,则该表可能包含

    帖子
  • 表的外键约束(因为评论是关于特定帖子的)和
  • 用户
  • 表的外键约束(因为每个注释都来自特定用户)。

    Table: comments
    post_id    user_id
    --
    1          1
    1          2
    1          3
    2          7
    

使用 primary key (post_id, user_id)unique (post_id, user_id) 强制实施该约束。

或者防止多次向数据库提交单个数据。

我可以想象这个要求的几种不同含义。您可能需要编辑问题,并添加更多详细信息。

为此,我认为如果单个用户在最后一次交互后被阻止 10 秒与数据库交互会更好。

这两个"要求"的含义完全不同。

  • 我想将用户限制为每个帖子一条评论,并且每个帖子只能一条评论。
  • 我想将用户限制为每 10 秒每篇帖子一条评论。因此,如果用户有耐心,我想让他们在每个帖子中输入 137 条评论。

这可以通过后端的触发器或前端的应用程序代码来完成。SQL 数据库管理系统通常不支持行之间或表之间的声明性约束。