📜  CAPTCHA、reCAPTCHA 和相关事物(1)

📅  最后修改于: 2023-12-03 15:14:05.926000             🧑  作者: Mango

CAPTCHA、reCAPTCHA 和相关事物

CAPTCHA 和 reCAPTCHA 都是为了防止恶意程序或机器恶意攻击而设立的防护措施,用于验证访问者是否为人类。

CAPTCHA

CAPTCHA 即 Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试)。CAPTCHA 常常在网站的登录、注册和提交表单等环节使用,要求用户正确输入图片中的数字或者字母代码,并防止了机器人恶意攻击。

实现方式

实现 CAPTCHA 有多种方式:

  • 生成图片验证码
  • 生成音频验证码
  • 简单加减法运算
  • 问题回答
图片验证码

其中生成图片验证码是最常见也最简单的方式,通过在图中生成混淆的数字或字母让用户进行输入验证。

代码示例

生成图片验证码可以使用 Python 的 Pillow 库,示例代码如下:

from PIL import Image, ImageDraw, ImageFont
import random

def generate_captcha(text, width, height):
    # 生成一个空白的图片
    image = Image.new("RGB", (width, height), (255, 255, 255))
    # 创建画布
    draw = ImageDraw.Draw(image)
    # 随机生成颜色
    colors = ["black", "red", "darkblue"]
    # 随机生成文字大小
    font_size = height // 2
    font = ImageFont.truetype("arial.ttf", font_size)
    # 随机生成字体
    font_type = "arial.ttf"
    # 随机旋转角度
    degrees = random.randint(-30, 30)
    draw.text((10, 10), text, font=font, fill=random.choice(colors))
    # 旋转图片
    image.rotate(degrees)
    # 添加一些干扰线
    draw.line((0, 0) + image.size, fill=random.choice(colors), width=5)
    draw.line((0, image.size[1], image.size[0], 0), fill=random.choice(colors), width=5)
    # 添加一些噪点
    for i in range(100):
        draw.point((random.randint(0, width), random.randint(0, height)), fill=random.choice(colors))
    # 返回验证码图片和正确的验证文本
    return image, text
reCAPTCHA

reCAPTCHA 是一种更先进的 CAPTCHA 模式,由 Google 公司开发。它利用人机区别的难度和一个可信的提供方的机器学习系统的力量,更加精确地识别非人类行为。

v2 和 v3

reCAPTCHA 有两个版本:v2 和 v3。

v2 版本包括两种类型:人类测试和机器人测试。人类测试要求用户拖动拼图、点选图像等更具交互性的方式,而机器人测试则类似于传统 CAPTCHA 的数字/字母输入。

v3 版本则不需要任何用户交互,只需要在网站中通过 JavaScript 集成即可。

实现方式

reCAPTCHA 的实现过程较为复杂。一般需要向 Google 申请一个 API Key,并通过 Google 提供的 JavaScript 脚本进行集成。

代码示例

以 v2 版本的实现为例,以下是一个简单的集成过程:

首先,需要在 HTML 文件中引入 reCAPTCHA 资源:

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

然后,在需要加入 reCAPTCHA 的表单中添加以下代码:

<div class="g-recaptcha" data-sitekey="your_site_key"></div>

最后,在提交表单时,需要验证用户输入是否正确:

function onSubmit(token) {
  var form = document.getElementById("test-form");
  form.submit();
}

这里的 onSubmit 函数会在用户点击提交按钮时被调用,以验证用户输入是否正确。如果验证成功,就可以提交表单了。

相关工具

除了 CAPTCHA 和 reCAPTCHA 之外,还有一些其他的安全工具可以用来保护网站,如:

  • 垃圾邮件拦截器
  • IP 限制
  • 反向代理站点
  • SSL 证书

通过灵活的使用这些工具,可以有效地保障网站的安全性。