ALTCHA
và CapMonster Cloud

Giải captcha, cài đặt trên trang web và kiểm thử.

Giá của giải pháp ALTCHA

CAPTCHA
Giá (USD)
$ 0.80
1000 token
Bạn nhận lại một website đã có captcha hoặc lớp bảo vệ khác nhưng không có quyền truy cập mã nguồn? Khi đó điều bạn cần biết là giải pháp nào đang chạy, cấu hình có đúng không và cách kiểm tra như thế nào.

Trong bài viết này, chúng tôi đã cố gắng trả lời tất cả những câu hỏi quan trọng. Bước đầu tiên để bắt đầu giải quyết vấn đề là xác định hệ thống bảo mật nào đang được sử dụng. Để làm điều đó, bạn có thể tham khảo danh sách các captcha và hệ thống chống bot phổ biến, trong đó có các ví dụ minh họa và những dấu hiệu chính giúp bạn nhanh chóng nhận biết mình đang làm việc với giải pháp nào.

Nếu bạn phát hiện trang web của mình đang sử dụng ALTCHA, bước tiếp theo là tìm hiểu chi tiết hơn về các đặc tính và cách hoạt động của nó. Ngay trong bài viết này, bạn cũng có thể xem hướng dẫn tích hợp hệ thống ALTCHA để hiểu đầy đủ cách nó vận hành trên trang web của bạn. Điều đó giúp bạn không chỉ nắm rõ lớp bảo vệ hiện tại mà còn lập kế hoạch bảo trì một cách hợp lý.

ALTCHA là gì
ALTCHA là gì
ALTCHA (Alternative CAPTCHA) là một hệ thống bảo vệ website khỏi bot và spam. Nó giúp phân biệt người dùng thật với chương trình tự động, đảm bảo trang web hoạt động an toàn và ổn định. ALTCHA là một lựa chọn thay thế hiện đại cho CAPTCHA truyền thống: sử dụng nhiệm vụ mã hóa nhẹ (proof-of-work) và không thu thập cookie hay theo dõi người dùng.
Background
Ví dụ về ALTCHA
Proof-of-Work (PoW)
Proof-of-Work (PoW)
Hệ thống mặc định sử dụng phương pháp xác minh Proof-of-Work (PoW), loại bỏ các câu đố hình ảnh và các kiểm tra gây phiền nhiễu. Cách tiếp cận này kết hợp giữa bảo mật và tiện lợi cho người dùng, cung cấp giải pháp captcha tinh tế phù hợp với hầu hết khách truy cập.
Code Captcha
Code Captcha
Bảo vệ có thể được nâng cao lên đến việc giải captcha văn bản.
Invisible Captcha
Invisible Captcha
Xác minh diễn ra mà không cần widget hiển thị; không yêu cầu người dùng thực hiện bất kỳ thao tác nào.

Cách giải ALTCHA qua CapMonster Cloud

Khi kiểm thử biểu mẫu chứa ALTCHA, bạn thường phải xác minh xem captcha đã tích hợp đúng và hoạt động ổn định chưa.

Bạn có thể tự kiểm tra captcha trên site.

  • Mở trang có form và đảm bảo captcha hiển thị.
  • Thử gửi form mà không giải captcha — máy chủ phải trả lỗi.
  • Sau khi giải thành công, form phải gửi đi trơn tru.

Để giải tự động có thể dùng CapMonster Cloud, dịch vụ nhận tham số captcha, xử lý trên máy chủ của họ và trả về token sẵn dùng. Chèn token này vào form để vượt qua kiểm tra mà không cần tương tác người dùng.

Làm việc với CapMonster Cloud qua API thường gồm các bước:

Tạo nhiệm vụTạo nhiệm vụ
arrow
Gửi yêu cầu APIGửi yêu cầu API
arrow
Nhận kết quảNhận kết quả
arrow
Áp dụng token lên trangÁp dụng token lên trang
arrow
Giải, chèn token và gửi form
Ví dụ Node.js cho chu trình đầy đủ nhận dạng captcha trên trang web của bạn. Các cách tiếp cận có thể: dùng yêu cầu HTTP để lấy HTML và tham số captcha, gửi phản hồi và xử lý kết quả; hoặc dùng công cụ tự động hóa (ví dụ: Playwright) — mở trang, chờ captcha xuất hiện, gửi tham số (có thể thử dữ liệu đúng hoặc sai), nhận kết quả qua client CapMonster Cloud, chèn token vào form và kiểm tra kết quả.
python
// npm install playwright
// npx playwright install chromium

const { chromium } = require("playwright");

const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Trang web của bạn với ALTCHA

(async () => {
  const browser = await chromium.launch({ headless: false, devtools: true });
  const context = await browser.newContext();
  const page = await context.newPage();

  // Bắt tất cả phản hồi từ endpoint Altcha
  let challengeResp = null;
  page.on("response", async (response) => {
    try {
      const url = response.url();
      if (url.startsWith("https://captcha.example.com/altcha")) { // Endpoint Altcha
        challengeResp = await response.json();
        console.log("Captured Altcha response:", challengeResp);
      }
    } catch (err) {
      console.warn("Error parsing Altcha response:", err);
    }
  });

  await page.goto(ALTCHA_PAGE, { waitUntil: "networkidle" });

  // Nhấn vào widget nếu có
  const widgetHandle = await page.$("altcha-widget");
  if (widgetHandle) {
    try {
      await widgetHandle.click();
    } catch {}
  }

  // Chờ challenge xuất hiện
  const start = Date.now();
  while (!challengeResp && Date.now() - start < 60000) { // Tăng timeout
    await new Promise((r) => setTimeout(r, 300));
  }

  if (!challengeResp) {
    console.error("Failed to capture Altcha challenge.");
    await browser.close();
    return;
  }

  const { challenge, salt, signature, maxnumbers } = challengeResp;

  // Tạo task trên CapMonster Cloud
  const createTaskBody = {
    clientKey: API_KEY,
    task: {
      type: "CustomTask",
      class: "altcha",
      websiteURL: ALTCHA_PAGE,
      websiteKey: "",
      userAgent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
      metadata: {
        challenge,
        iterations: maxnumbers || 100000,
        salt,
        signature,
      },
    },
  };

  const taskResp = await fetch("https://api.capmonster.cloud/createTask", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(createTaskBody),
  }).then((r) => r.json());

  console.log("CreateTask response:", taskResp);
  if (!taskResp?.taskId) {
    console.error("CreateTask failed:", taskResp);
    await browser.close();
    return;
  }

  const taskId = taskResp.taskId;

  // Nhận giải pháp
  let fullSolution = null;
  const pollStart = Date.now();
  while (Date.now() - pollStart < 120000) {
    const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ clientKey: API_KEY, taskId }),
    }).then((r) => r.json());

    if (res.status === "ready") {
      fullSolution = res.solution;
      console.log("Solution:", fullSolution);
      break;
    }
    await new Promise((r) => setTimeout(r, 3000));
  }

  if (!fullSolution) {
    console.error("No solution received in time.");
    await browser.close();
    return;
  }

  const token = fullSolution?.data?.token || fullSolution?.token || fullSolution?.data;

  if (!token) {
    console.error("Token not found in solution:", fullSolution);
    await browser.close();
    return;
  }

  //Chèn token
  await page.evaluate((t) => {
    let input = document.querySelector("#captchaParaValidar");
    if (!input) {
      input = document.createElement("input");
      input.type = "hidden";
      input.id = "captchaParaValidar";
      input.name = "captchaParaValidar";
      (document.querySelector("form") || document.body).appendChild(input);
    }
    input.value = t;

    let alt = document.querySelector('input[name="altcha"]');
    if (!alt) {
      alt = document.createElement("input");
      alt.type = "hidden";
      alt.name = "altcha";
      (document.querySelector("form") || document.body).appendChild(alt);
    }
    alt.value = t;

    const widget = document.querySelector("altcha-widget");
    if (widget) {
      widget.setAttribute("data-state", "verified");
      const checkbox = widget.querySelector("input[type='checkbox']");
      if (checkbox) {
        checkbox.checked = true;
        checkbox.dispatchEvent(new Event("change", { bubbles: true }));
      }
      const label = widget.querySelector(".altcha-label");
      if (label) label.textContent = "Verified";
    }
  }, token);

  console.log("Token injected:", token);
})();
Cách kết nối ALTCHA với trang web của bạn
Để hiểu cách captcha hoạt động trên trang web, logic xác minh, kết nối lại hoặc cấu hình lại, nên đọc phần này. Nó mô tả quá trình tích hợp bảo vệ và giúp bạn nắm nhanh các chi tiết.

1. Cài đặt widget

Tùy chọn 1 — qua CDN (dễ nhất). Thêm vào <head> của HTML:

markup
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>

Tùy chọn 2 — qua npm:

javascript
npm install altcha

Import widget vào file JS của bạn:

javascript
import "altcha";

2. Thêm widget vào form.

Chèn component <altcha-widget> vào form cần bảo vệ:

markup

<form method="POST" action="/submit">
  <altcha-widget challengeurl="/altcha/challenge"></altcha-widget>
  <button type="submit">Send</button>
</form>

challengeurl — endpoint server của bạn để phát challenge.

Nếu sử dụng ALTCHA Sentinel (bảo vệ server sẵn có chống bot và spam, với machine learning và phân tích traffic), sử dụng URL của nó thay vì server của bạn:

markup

<altcha-widget 
  challengeurl="https://sentinel.example.com/v1/challenge?apiKey=YOUR_API_KEY">
</altcha-widget>

3. Kiểm tra server.

Cách kiểm tra diễn ra:

  • 1) Widget tạo payload — JSON mã hóa Base64, thường gửi như trường form altcha.
  • 2) Trên server kiểm tra payload bằng cách mã hóa (không cần gọi API thêm).
  • 3) Sau khi kiểm tra thành công, form có thể được xử lý.

Kiểm tra qua ALTCHA Sentinel:

Dùng thư việnDùng thư viện
arrow

Qua HTTP API Sentinel (nếu thư viện không có sẵn):Qua HTTP API Sentinel (nếu thư viện không có sẵn):
arrow

4. Kiểm tra không dùng Sentinel (server riêng)

Tạo challenge:

javascript

import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Secret key HMAC của bạn

const challenge = await createChallenge({ hmacKey });

// Trả challenge dưới dạng JSON cho widget

Kiểm tra payload khi gửi form:

javascript

import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Secret key HMAC của bạn

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // Kiểm tra thành công — xử lý dữ liệu form
}

Trong trường hợp này, bạn tự tạo endpoint /altcha/challenge để phát nhiệm vụ và kiểm tra trên server.

Background
Các lỗi thường gặp và cách xử lý
Bug Icon
challengeurl hoặc API Key không hợp lệ
Widget không tải hoặc trả về lỗi khi kiểm tra.
Bug Icon
Timeout khi giải
Server chưa kịp kiểm tra payload. Tăng thời gian chờ hoặc đảm bảo kiểm tra server hoạt động chính xác.
Bug Icon
Payload rỗng
Lỗi khi gửi kết quả từ widget đến server.
Bug Icon
Verification failed
Payload đã hết hạn, bị sử dụng lại hoặc bị giả mạo. Để chẩn đoán, bật logging và kiểm tra trường verified và verificationData trong phản hồi từ server hoặc Sentinel.
Kiểm tra độ bền vững của lớp bảo vệ
Sau khi tích hợp, hãy đảm bảo hệ thống thực sự chặn được những hành động tự động.
Khuyến nghị về bảo mật và tối ưu
Chỉ giữ <span class="font-bold">khóa bí mật</span> (HMAC hoặc API Key cho Sentinel) trên máy chủ — không gửi lên frontend.
<span class="font-bold">Ghi lại lỗi</span> và các sự kiện xác minh (<span class="font-bold">verified: false</span> và <span class="font-bold">verificationData</span>) để hiểu lý do kiểm tra thất bại.
Để minh bạch và tạo niềm tin cho người dùng, <span class="font-bold">thêm liên kết đến chính sách quyền riêng tư</span> và <span class="font-bold">điều khoản sử dụng ALTCHA</span> nếu cần.
Kết luận

Nếu bạn tiếp quản một trang web đã được cài sẵn captcha hoặc một hệ thống bảo vệ khác nhưng lại không có quyền truy cập vào mã nguồn thì cũng không có gì đáng lo! Việc xác định chính xác công nghệ nào đang được sử dụng khá đơn giản. Để kiểm tra xem mọi thứ có hoạt động đúng hay không, bạn có thể dùng dịch vụ nhận dạng CapMonster Cloud trong một môi trường thử nghiệm tách biệt nhằm đảm bảo cơ chế xử lý token và logic kiểm tra đang vận hành chính xác.

Với ALTCHA, bạn chỉ cần nhận diện hệ thống, quan sát hành vi của nó và xác nhận rằng lớp bảo vệ hoạt động đúng cách. Trong bài viết này, chúng tôi đã chỉ ra cách nhận biết ALTCHA và nơi tìm hướng dẫn tích hợp hoặc cấu hình lại, giúp bạn tự tin duy trì lớp bảo vệ và kiểm soát hoạt động của nó.

Conclusion
Liên kết hữu ích
DocIconTài liệu ALTCHADocIconMã nguồn ALTCHADocIconTài liệu CapMonster Cloud (làm việc với ALTCHA)

Câu hỏi thường gặp về ALTCHA

Widget ALTCHA có thể hoạt động mà không cần sitekey truyền thống, vì vậy CapMonster Cloud chấp nhận chuỗi rỗng ("") cho tham số websiteKey.

Quan trọng: trường này vẫn bắt buộc trong payload JSON. Ngay cả khi trang dùng ALTCHA Sentinel và hiển thị apiKey trong challengeurl, đừng trích xuất — chỉ cần gửi "websiteKey": "".

Tham số iterations trong tác vụ CapMonster Cloud của bạn ánh xạ trực tiếp tới giá trị maxnumber (số tối đa cho phép tính toán) trong đối tượng challenge do endpoint ALTCHA trên trang đích trả về. Bạn phải truyền chính xác giá trị này để tránh lỗi giải im lặng.

Phản hồi getTaskResult cung cấp đồng thời cả number thuần và token đầy đủ mã hóa base64 trong cùng payload. Nhà phát triển chỉ cần trích xuất giá trị mà trang đích yêu cầu để xác thực.

Một số form chỉ cần số đã tính, trong khi form khác mong đợi toàn bộ tập tham số được mã hóa an toàn ở định dạng base64.

CapMonster Cloud hỗ trợ cả ba biến thể ALTCHA:

  • Proof-of-Work — widget ALTCHA mặc định chạy challenge tính toán trong trình duyệt.
  • Code Captcha — yêu cầu người dùng hoặc script nhập mã ngắn.
  • Invisible Captcha — chạy nền không có widget hiển thị hoặc tương tác người dùng.

Tìm hiểu cách tìm tất cả tham số cần thiết để tạo tác vụ

Sau khi client gửi challenge, backend xác minh dữ liệu (salt, signature, số đã tính và difficulty). Bạn có thể triển khai theo hai cách:

  • Sentinel API: tự động xác thực payload và ngăn tấn công replay (xử lý trùng lặp và hết hạn).
  • Server tùy chỉnh: dùng hàm verifySolution để kiểm tra thủ công boolean verified và payload.

Xem chương Cách kết nối ALTCHA với trang web của bạn (bước 3–4) ở trên để biết chi tiết.

Lưu ý: nếu xác thực thất bại (ví dụ trả về 403 Forbidden), thường do payload hết hạn hoặc tái sử dụng (tấn công replay), không phải do tính PoW sai.