ViraStack
  • Akademi
  • Hakkında
  • Destek
Genel BakışBaşlangıçÖrnekler
ViraStack

Frontend ekosistemi: ücretsiz rehberler, proje şablonları, AI kuralları ve form bileşenleri.

Ürünler

  • ViraStack Start
  • ViraStack AI
  • ViraStack Mask
  • ViraStack Password
  • ViraStack Guide

Keşfet

  • Akademi
  • Hakkında
  • Marka
  • Destek

© 2026 ViraStack.

Açık kaynak · MIT

Örnekler

  • Tümü
  • Basit
  • Disabled / readOnly
  • Göster / gizle
  • Güç göstergesi
  • Kişisel bilgi
  • Mask ile kayıt
  • Özel ikonlar
  • Özel metin
  • Parola tekrarı
  • Programatik
  • Prop merge
  • React Hook Form + Zod
  • Server Action
  • Sızmış parolalar

Sızmış parolalar

Have I Been Pwned'i bir Server Action'dan sorgulayın.

← Tüm örnekler·pwned

Önizleme

// components/leak-check.tsx
"use client";
 
import { useState, useTransition } from "react";
 
import { useViraPassword } from "@virastack/password";
import type { PwnedResult } from "@virastack/password/pwned";
 
import { checkPassword } from "@/app/signup/pwned-action";
 
export function LeakCheck() {
  const [result, setResult] = useState<PwnedResult | null>(null);
  const [pending, startTransition] = useTransition();
  const { inputProps, btnProps } = useViraPassword({
    inputProps: { name: "password", defaultValue: "password123" },
  });
 
  function onSubmit(event: React.FormEvent<HTMLFormElement>) {
    event.preventDefault();
    const password = String(new FormData(event.currentTarget).get("password"));
    startTransition(async () => setResult(await checkPassword(password)));
  }
 
  return (
    // POST: a submit before hydration never puts the password in the URL.
    <form method="post" onSubmit={onSubmit}>
      <label htmlFor={inputProps.id}>Password</label>
      <div>
        <input {...inputProps} />
        <button {...btnProps} />
      </div>
      <button type="submit" disabled={pending}>
        Check leaks
      </button>
 
      <p aria-live="polite">
        {result?.status === "pwned" &&
          `Seen ${result.count.toLocaleString("en")} times in data breaches.`}
        {result?.status === "safe" && "Not found in known breaches."}
        {/* Fail open: never block the user because the check failed. */}
        {result?.status === "unknown" &&
          `Could not check (${result.reason}). The form still works.`}
      </p>
    </form>
  );
}
// app/signup/pwned-action.ts
"use server";
 
import { checkPwned, type PwnedResult } from "@virastack/password/pwned";
 
// From the server, Have I Been Pwned never sees the user's IP.
// Only the first 5 characters of the SHA-1 hash are sent.
export async function checkPassword(password: string): Promise<PwnedResult> {
  return checkPwned(password, { timeout: 3000 });
}

Detaylar

  • Sunucudan yalnızca SHA-1 özetinin ilk 5 karakteri çıkar.
  • Sunucudan çağırmak kullanıcının IP'sini HIBP'den uzak tutar.
  • Herhangi bir hatada durum unknown olur; kullanıcıyı engellemeyin.

Hook API için useViraPassword(), stil ve ikonlar için customization.

ÖncekiServer Action

Bu sayfada

  • Önizleme
  • Detaylar
Hata mı var? Düzeltin