ALTCHA
i CapMonster Cloud

Rozwiązywanie captcha, instalacja na stronie i testowanie.

Cennik rozwiązania ALTCHA

CAPTCHA
Cena (USD)
$ 0.80
1000 tokenów
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/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;

  // 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
<span class="font-bold">Przechowuj tajne klucze</span> (HMAC lub API Key dla Sentinel) tylko na serwerze — nie wysyłaj ich na frontend.
<span class="font-bold">Loguj błędy</span> i zdarzenia weryfikacji (<span class="font-bold">verified: false</span> i <span class="font-bold">verificationData</span>), aby zrozumieć przyczyny niepowodzeń.
Dla przejrzystości i zaufania użytkowników <span class="font-bold">dodaj linki do polityki prywatności</span> i <span class="font-bold">warunków korzystania z ALTCHA</span>, 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)

Często zadawane pytania o ALTCHA

Widżety ALTCHA mogą działać bez tradycyjnych sitekey, dlatego CapMonster Cloud akceptuje pusty ciąg ("") dla parametru websiteKey.

Ważne: to pole nadal jest obowiązkowe w payloadzie JSON. Nawet jeśli witryna używa ALTCHA Sentinel i udostępnia apiKey w challengeurl, nie wyciągaj go — po prostu wyślij "websiteKey": "".

Parametr iterations w zadaniu CapMonster Cloud odpowiada bezpośrednio wartości maxnumber (maksymalna liczba do obliczeń) w obiekcie challenge zwracanym przez endpoint ALTCHA na stronie docelowej. Musisz przekazać dokładnie tę wartość, aby uniknąć cichych błędów rozwiązywania.

Odpowiedź getTaskResult dostarcza jednocześnie zwykłą number i pełny token zakodowany w base64 (token) w tym samym payloadzie. Deweloper po prostu wyciąga wartość wymaganą przez witrynę docelową do walidacji.

Niektóre formularze wymagają tylko obliczonej liczby, inne oczekują pełnego zestawu parametrów bezpiecznie zaszyfrowanych w formacie base64.

CapMonster Cloud obsługuje wszystkie trzy warianty ALTCHA:

  • Proof-of-Work — domyślny widżet ALTCHA uruchamiający obliczeniowe challenge w przeglądarce.
  • Code Captcha — wymaga od użytkownika lub skryptu wpisania krótkiego kodu.
  • Invisible Captcha — działa w tle bez widocznego widżetu lub interakcji użytkownika.

Dowiedz się, jak znaleźć wszystkie wymagane parametry do utworzenia zadania

Po przesłaniu challenge przez klienta backend weryfikuje dane (salt, signature, obliczona liczba i difficulty). Możesz to zaimplementować na dwa sposoby:

  • Sentinel API: automatycznie waliduje payload i zapobiega atakom replay (deduplikacja i wygaśnięcie).
  • Własny serwer: użyj funkcji verifySolution, aby ręcznie sprawdzić boolean verified i payload.

Szczegóły w rozdziale Jak podłączyć ALTCHA do swojej strony (kroki 3–4) powyżej.

Uwaga: jeśli walidacja nie powiedzie się (np. zwraca 403 Forbidden), zwykle wynika to z wygasłego lub ponownie użytego payloadu (atak replay), a nie z błędnego obliczenia PoW.