我现在研究不用captcha的Nodejs防spam机制

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

我现在研究不用captcha的Nodejs防spam机制

刚找到一个方法: Fighting Spam with CSS用隐含的输入框,很简单的原理! 不知道这方法有没有被现在的SPAM机器破解了? 大家还有有好的建议吗?

4 回复

我现在研究不用captcha的Nodejs防spam机制

最近我在研究如何在不使用CAPTCHA的情况下防止垃圾信息(spam)攻击。通常,CAPTCHA是一种常见的手段,但它可能会给用户带来不便。因此,我找到了一种基于CSS的防spam机制,这种方法利用了现代浏览器的特性来检测机器人。

方法介绍

这种方法的核心思想是在表单中添加一个隐藏的输入框,正常用户不会看到这个输入框,而机器人可能会自动填写所有可见的输入框,包括这个隐藏的输入框。通过检查这个隐藏输入框是否被填充,我们可以判断当前请求是否来自机器人。

示例代码

首先,我们需要在HTML表单中添加一个隐藏的输入框:

<form action="/submit" method="POST">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">

    <label for="email">Email:</label>
    <input type="email" id="email" name="email">

    <!-- 隐藏的输入框 -->
    <div style="display: none;">
        <label for="website">Website:</label>
        <input type="text" id="website" name="website">
    </div>

    <button type="submit">Submit</button>
</form>

接下来,在服务器端(这里以Node.js为例),我们需要检查这个隐藏的输入框是否被填充。如果被填充,则认为这是一个垃圾信息请求,并拒绝提交。

const express = require('express');
const app = express();

app.use(express.urlencoded({ extended: true }));

app.post('/submit', (req, res) => {
    const { website } = req.body;

    if (website) {
        // 如果隐藏输入框被填充,则认为这是垃圾信息
        return res.status(400).send('Spam detected!');
    }

    // 正常处理表单数据
    // 这里可以将表单数据保存到数据库或其他地方
    res.send('Form submitted successfully!');
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

解释

  1. HTML表单:我们在表单中添加了一个隐藏的输入框<input type="text" id="website" name="website">。这个输入框通过CSS设置为display: none;,使它对普通用户不可见。
  2. 服务器端检查:在服务器端,我们使用Express框架接收表单数据,并检查website字段是否被填充。如果被填充,我们认为这是一个垃圾信息请求,并返回错误信息。

这种方法简单且有效,但需要注意的是,随着技术的发展,一些高级的垃圾信息机器人可能已经能够识别并绕过这种隐藏输入框的方法。因此,结合其他防spam策略(如IP黑名单、行为分析等)会更加安全可靠。


抢个沙发,居然这么么久没人顶

这个方法… err… 巧妙的蛋疼啊 话说spam脚本如果就按照一般形式填一个框,或者意识到有这类机制存在,也很好修改适应

对于“我现在研究不用captcha的Nodejs防spam机制”的问题,可以采用一些前端与后端相结合的方法来减少垃圾信息。这里介绍一种基于CSS的隐形输入框方法,这种方法让普通用户无法看到这个输入框,但大多数自动化垃圾程序会自动填充所有可见或不可见的输入框。

方法概述

  1. 前端部分

    • 创建一个隐形输入框(通过CSS display: none 或者定位到屏幕外)。
    • 当这个输入框被填写时,认为这是一个垃圾提交。
    • 添加一个隐藏字段,比如“human”字段,并且默认值为 “true”。当用户填写隐形输入框时,通过JavaScript将该字段设为 “false”。
    • 提交表单前检查这个隐藏字段是否仍为 “true”,如果是,则阻止提交。
  2. 后端部分

    • 在处理表单提交时,检查这个隐藏字段的值是否为 “true”。如果是,可以认为是垃圾提交并拒绝处理。

示例代码

前端HTML (index.html)

<form id="myForm">
    <input type="text" name="name" placeholder="Your Name">
    <input type="email" name="email" placeholder="Your Email">
    <div style="display:none;">
        <label for="robot-test">Please leave this field empty:</label>
        <input type="text" id="robot-test" name="robot-test">
    </div>
    <input type="hidden" id="isHuman" name="isHuman" value="true">
    <button type="submit">Submit</button>
</form>

前端JavaScript (script.js)

document.getElementById('myForm').addEventListener('submit', function(event) {
    if (document.getElementById('robot-test').value !== '') {
        document.getElementById('isHuman').value = 'false';
        alert("It looks like you're a robot. Please fill out the form manually.");
        event.preventDefault();
    }
});

后端Node.js (app.js)

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.urlencoded({ extended: true }));

app.post('/submit-form', (req, res) => {
    if (req.body.isHuman === 'true') {
        res.send('This seems to be a spam submission. Please submit the form manually.');
    } else {
        // Process the form normally
        res.send('Form submitted successfully!');
    }
});

app.listen(3000, () => console.log('Server running on port 3000'));

总结

这种方法依赖于垃圾邮件发送器无法识别或忽略CSS隐藏的输入框。虽然这种方法可能不是绝对安全,但它可以有效过滤掉大部分的垃圾提交。如果需要更高级别的防护,可以考虑结合使用其他技术,如速率限制、用户行为分析等。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!