logo
bars

ALTCHA
i CapMonster Cloud

Rozwiązywanie captcha, instalacja na stronie i testowanie.
Odziedziczyłeś stronę z już wdrożoną captchą lub ochroną, ale bez dostępu do kodu źródłowego? Naturalnie pojawia się pytanie, jaka technologia jest używana, czy działa poprawnie i jak ją przetestować.

W tym artykule staraliśmy się odpowiedzieć na wszystkie najważniejsze pytania. Pierwszym krokiem w rozwiązywaniu problemu jest ustalenie, jaki system ochrony jest używany. W tym celu możesz skorzystać z listy popularnych captcha i systemów ochrony antybotowej, gdzie znajdziesz przykłady graficzne oraz kluczowe cechy, które pomogą szybko rozpoznać, z czym masz do czynienia.

Jeśli okaże się, że na Twojej stronie używany jest ALTCHA, kolejnym krokiem będzie dokładniejsze poznanie jej właściwości i sposobu działania. W tym artykule możesz również zapoznać się z instrukcją integracji systemu ALTCHA, aby w pełni zrozumieć, jak funkcjonuje on na Twojej stronie. Dzięki temu nie tylko lepiej poznasz obecną ochronę, ale też świadomie zaplanujesz jej dalsze utrzymanie.

Czym jest ALTCHA
Czym jest ALTCHA
ALTCHA (Alternative CAPTCHA) to system ochrony strony internetowej przed botami i spamem. Pomaga odróżnić prawdziwych użytkowników od programów automatycznych, zapewniając bezpieczne i stabilne działanie strony. ALTCHA jest nowoczesną alternatywą dla tradycyjnych CAPTCHA: wykorzystuje lekkie zadanie kryptograficzne (proof-of-work) i nie zbiera ciasteczek ani nie śledzi użytkowników.
Background
Przykłady ALTCHA
Proof-of-Work (PoW)
Proof-of-Work (PoW)
System domyślnie wykorzystuje metodę weryfikacji Proof-of-Work (PoW), eliminując wizualne zagadki i uciążliwe kontrole. Takie podejście łączy bezpieczeństwo z wygodą użytkownika, oferując dyskretne rozwiązanie captcha odpowiednie dla większości odwiedzających.
Code Captcha
Code Captcha
Ochronę można wzmocnić do przejścia tekstowej captcha.
Invisible Captcha
Invisible Captcha
Weryfikacja odbywa się bez widocznego widżetu i nie wymaga działań od użytkownika.

Jak rozwiązać ALTCHA przez CapMonster Cloud

Podczas testowania formularzy z ALTCHA często trzeba zweryfikować, czy captcha jest poprawnie zintegrowana i działa.

Możesz ręcznie sprawdzić captchę na swojej stronie.

  • Otwórz stronę formularza i upewnij się, że captcha się wyświetla.
  • Spróbuj wysłać formularz bez rozwiązania — serwer powinien zwrócić błąd.
  • Po poprawnym rozwiązaniu formularz musi wysłać się bez problemów.

Do automatycznego rozwiązywania wykorzystaj narzędzia takie jak CapMonster Cloud, które przyjmują parametry captcha, przetwarzają je na serwerach i zwracają gotowy token. Wstaw go do formularza, aby przejść weryfikację bez udziału użytkownika.

Praca z CapMonster Cloud poprzez API zazwyczaj obejmuje następujące kroki:

Tworzenie zadaniaTworzenie zadania
arrow
Wysyłanie żądania APIWysyłanie żądania API
arrow
Odebranie wynikuOdebranie wyniku
arrow
Umieszczenie tokenu na stronieUmieszczenie tokenu na stronie
arrow
Rozwiązywanie, wstawianie tokena i wysyłanie formularza
Przykład w Node.js dla pełnego cyklu rozpoznawania captcha na stronie. Możliwe podejścia: użycie żądań HTTP w celu uzyskania HTML i parametrów captcha, przesłanie odpowiedzi i przetworzenie wyniku; lub przy użyciu narzędzi automatyzacyjnych (np. Playwright) — otwarcie strony, oczekiwanie na captcha, przesłanie parametrów (do testowania można przesłać poprawne lub niepoprawne dane), otrzymanie wyniku przez klienta CapMonster Cloud, wstawienie tokena do formularza i sprawdzenie wyniku.
// npm install playwright
// npx playwright install chromium

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

const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Twoja strona z ALTCHA

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

  // Przechwytywanie wszystkich odpowiedzi z endpointu 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" });

  // Kliknij widżet, jeśli istnieje
  const widgetHandle = await page.$("altcha-widget");
  if (widgetHandle) {
    try {
      await widgetHandle.click();
    } catch {}
  }

  // Czekamy na pojawienie się challenge
  const start = Date.now();
  while (!challengeResp && Date.now() - start < 60000) { // Zwiększony 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;

  // Tworzymy zadanie w 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/145.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;

  // Pobieramy rozwiązanie
  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;
  }

  //Wstawiamy 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);
})();
Jak podłączyć ALTCHA do swojej strony
Aby w pełni zrozumieć działanie captcha na swojej stronie, logikę weryfikacji, ponownie podłączyć lub skonfigurować, zalecamy zapoznanie się z tą sekcją. Opisuje proces integracji ochrony i pomaga szybko zrozumieć wszystkie szczegóły.

1. Instalacja widżetu

Opcja 1 — przez CDN (najprostsze). Dodaj do <head> swojego HTML:

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

Opcja 2 — przez npm:

npm install altcha

Importuj widżet do swojego pliku JS:

import "altcha";

2. Dodanie widżetu do formularza.

Wstaw komponent <altcha-widget> w formularzu, gdzie wymagana jest ochrona:


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

challengeurl — Twój endpoint serwera do wydawania zadań (challenge).

Jeśli używasz ALTCHA Sentinel (gotowa ochrona serwera przed botami i spamem z uczeniem maszynowym i analizą ruchu), zamiast własnego serwera użyj jego URL:


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

3. Weryfikacja po stronie serwera.

Jak przebiega weryfikacja:

  • 1) Widżet generuje payload — JSON zakodowany w Base64, zwykle wysyłany jako pole formularza altcha.
  • 2) Na serwerze weryfikujesz payload kryptograficznie (bez dodatkowych żądań API).
  • 3) Po pomyślnej weryfikacji można przetworzyć formularz.

Weryfikacja przez ALTCHA Sentinel:

Za pomocą bibliotekiZa pomocą biblioteki
arrow

Przez HTTP API Sentinel (jeśli biblioteka niedostępna):Przez HTTP API Sentinel (jeśli biblioteka niedostępna):
arrow

4. Weryfikacja bez Sentinel (własny serwer)

Generowanie challenge:


import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Twój sekretny klucz HMAC

const challenge = await createChallenge({ hmacKey });

// Zwracamy challenge w JSON dla widżetu

Weryfikacja payload przy wysyłaniu formularza:


import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Twój sekretny klucz HMAC

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // Weryfikacja zakończona sukcesem — przetwarzanie danych formularza
}

W tym przypadku sam tworzysz endpoint /altcha/challenge do wydawania zadań i weryfikujesz je na serwerze.

Background
Możliwe błędy i debugowanie
Bug Icon
Nieprawidłowy challengeurl lub API Key
Widżet nie ładuje się lub przy weryfikacji zwraca błąd.
Bug Icon
Timeout rozwiązania
Serwer nie zdążył sprawdzić payload. Zwiększ czas oczekiwania lub upewnij się, że weryfikacja po stronie serwera działa poprawnie.
Bug Icon
Pusty payload
Błąd przy przesyłaniu wyniku z widżetu na serwer.
Bug Icon
Verification failed
Payload wygasł, został użyty ponownie lub został sfałszowany. W celach diagnostycznych włącz logowanie i sprawdź pola verified oraz verificationData w odpowiedzi serwera lub Sentinela.
Sprawdzenie odporności ochrony
Po integracji upewnij się, że system faktycznie chroni stronę przed automatycznymi działaniami.
Rekomendacje dotyczące bezpieczeństwa i optymalizacji
<b>Przechowuj tajne klucze</b> (HMAC lub API Key dla Sentinel) tylko na serwerze — nie wysyłaj ich na frontend.
<b>Loguj błędy</b> i zdarzenia weryfikacji (<b>verified: false</b> i <b>verificationData</b>), aby zrozumieć przyczyny niepowodzeń.
Dla przejrzystości i zaufania użytkowników <b>dodaj linki do polityki prywatności</b> i <b>warunków korzystania z ALTCHA</b>, jeśli jest to wymagane.
Wnioski

Jeśli przejąłeś stronę internetową, na której jest już zainstalowany captcha lub inny system zabezpieczeń, a jednocześnie nie masz dostępu do kodu — to nic strasznego! Dość łatwo jest ustalić, jaka dokładnie technologia jest używana. Aby sprawdzić poprawność działania, możesz skorzystać z usługi rozpoznawania CapMonster Cloud w odizolowanym środowisku testowym, żeby upewnić się, że mechanizm przetwarzania tokenów i logika weryfikacji działają prawidłowo.

W przypadku ALTCHA wystarczy rozpoznać system, przeanalizować jego zachowanie i upewnić się, że zabezpieczenie działa poprawnie. W artykule pokazaliśmy, jak zidentyfikować ALTCHA oraz gdzie znaleźć instrukcje dotyczące jego podłączenia lub ponownej konfiguracji, aby móc pewnie utrzymywać ochronę i kontrolować jej działanie.

Conclusion
Przydatne linki
DocIconDokumentacja ALTCHADocIconKod źródłowy ALTCHADocIconDokumentacja CapMonster Cloud (praca z ALTCHA)