PHP阻止带有链接的表单提交的最佳实践


PHP best practice for blocking form submissions with links?

最近,为了发布链接(反向链接机器人),我们的表单上出现了大量机器人帖子。

我们添加了reCaptcha,结果发现它被破解了,机器人可以找到正确的响应。

我们添加了一个Honeypot字段,但发现这些提交的内容是在不使用表单的情况下发布的。看起来第一个目录中列出了所需字段的表单,然后只提交这些字段,破解captcha并将其垃圾邮件发布到评论字段。

我敢肯定,他们盲目地在任何表格上发帖,认为这将是一条博客评论,所以我们的联系我们表格陷入了混乱。

下一步是如果内容包含链接,则阻止提交。这似乎是最好的逻辑方法,因为它将他们的目标作为阻止的触发器。

问题:查找url字符是隔离垃圾邮件提交的最佳方法吗?FILTER_SANITIZE_url是否可以用作触发拒绝的挂钩?

只是扩展了我的评论,因为一些人似乎认为它有价值。

对此有几种方法。

我建议在表单中添加一个nonce作为隐藏字段。当用户从您的网站请求表单时,会创建一个nonce,该用户必须将其与表单一起返回,才能使其成为有效提交。

这个答案提供了更多的信息。如何创建和使用随机数

您还谈到了阻止所有包含任何html的条目。一种简单的方法是

if (strip_tags($string) !== $string)
    // Drop post as it had html in it
if (strstr($data,'http://')) {
    echo "contains link";
}

您可以将一些校验和与表单数据一起传递以验证它。在客户端,在表单的"提交"事件上添加一个事件侦听器,例如,您可以在其中计算所有表单字段的长度总和,然后将其放入隐藏字段。在服务器端,以相同的方式计算校验和,并将其与隐藏字段中的值进行比较。

长度总和是最简单的检查方法,但它会切断所有自动机器人,这些机器人并没有完全针对你的网站。但如果这还不够,你可以创建更复杂的算法来计算校验和,然后混淆javascript,因此需要付出更多的努力才能使这些机器人适应你的保护系统。