API V2.0.0 Security Patch

Tài liệu hướng dẫn

Cách sử dụng giao diện và API của ShortYourLinks an toàn & hiệu quả

Giới thiệu

ShortYourLinks là công cụ rút gọn liên kết bảo mật cao, tập trung vào quyền riêng tư và chống bot. Dữ liệu của bạn sẽ tự động biến mất sau 30 ngày để đảm bảo an toàn.

💡 Hệ thống sử dụng cơ chế bảo mật 3 lớp: Cloudflare Turnstile, One-Time HMAC Token và Ẩn lỗi (Silent Failure) để ngăn chặn tuyệt đối các hình thức spam bot.

Sử dụng giao diện Web

  1. 1. Dán link dài vào ô nhập liệu ở trang chủ.
  2. 2. Xác thực Cloudflare Turnstile (bắt buộc để mở khóa nút rút gọn).
  3. 3. Nhấn nút rút gọn và nhận kết quả.
  4. 4. Bạn có thể quản lý link tại mục "Manage" (Liên kết với địa chỉ IP mạng của bạn).

Tài liệu API (Public)

API của chúng tôi cho phép bạn tạo và quản lý link từ ứng dụng của riêng bạn (Discord Bot, Telegram Bot, script automation...).

POST https://shortyourlinks.prmgvyt.xyz/api.php

Headers bắt buộc

Content-Type: application/json
X-CSRF-Token:   <csrf_token>
X-Access-Token: <access_token>
X-Signature:    <hmac_sha256_signature>
⚠️ Các token bảo mật được sinh tự động khi tải trang và chỉ dùng được một lần. Phải tải lại trang để lấy token mới.

Cấu trúc yêu cầu (JSON):

{
  "action": "create",
  "url": "https://example.com/your-very-long-link-here",
  "cf-turnstile-response": "<turnstile_token>"
}

Phản hồi thành công 200 OK

{
  "status": "success",
  "message": "Link created successfully.",
  "code": "aB12zX",
  "short_url": "https://shortyourlinks.prmgvyt.xyz/aB12zX",
  "expires": "30 days"
}
⚠️ Lưu ý: Link tạo qua API sẽ có hàng chờ 5 giây trước khi hoạt động.

Kiểm tra thống kê (Analytics)

Lấy số lượt click và ngày tạo của một mã link ngắn.

Yêu cầu

{
  "action": "analytics",
  "code": "aB12zX",
  "cf-turnstile-response": "<turnstile_token>"
}

Phản hồi 200 OK

{
  "status": "success",
  "data": {
    "long_url": "https://example.com/...",
    "created_at": "2026-04-15 08:30:00",
    "clicks": 142
  }
}

Bảo mật API

1. Cơ chế One-Time Token

Mỗi lần trang được tải, server sinh một bộ token mới (csrf, access_token, signature). Token cũ bị vô hiệu hóa ngay sau khi sử dụng thành công. Điều này ngăn chặn tấn công Replay Attack.

2. Xác thực chữ ký HMAC-SHA256

Server tính toán lại chữ ký từ SESSION và so sánh với header gửi lên. Nếu không khớp → từ chối ngay lập tức.

// Signature formula (server-side)
 $expected = hash_hmac("sha256", $session_csrf . $session_token, $secret);
if (!hash_equals($expected, $submitted_sign)) {
    // → Redirect to 404 (Silent Failure)
}

3. Cloudflare Turnstile

Mọi request đều phải kèm token Turnstile hợp lệ. Server xác minh với API của Cloudflare trước khi xử lý — bot và script tự động bị chặn.

4. Ẩn lỗi (Silent Failure)

Bất kỳ hành động nào vi phạm (Sai token, Rate limit, URL cấm) đều sẽ bị đẩy về trang 404 Not Found. Điều này khiến bot không thể biết được mình bị chặn vì lỗi gì, ngăn chặn tấn công dò tìm lỗ hổng (Enumeration).

🚫 Không bao giờ hardcode token vào source code hay lưu vào file. Token chỉ sống trong session và phải được đọc từ DOM khi form được load.

Best Practices

✅ Nên làm

• Luôn kiểm tra status === "success" trước khi dùng short_url
• Thêm delay 5 giây sau khi tạo link trước khi redirect
• Validate URL phía client (chỉ chấp nhận http://https://)
• Dùng try/catch cho toàn bộ fetch call
• Cache short URL nếu dùng nhiều lần cùng một URL dài

❌ Không nên làm

• Không gọi API liên tục trong vòng lặp (rate limit sẽ kích hoạt và ẩn dưới dạng 404)
• Không dùng token từ lần request trước (đã bị invalidate)
• Không truyền javascript:, data:, ftp: URL — sẽ bị từ chối
• Không lưu token vào localStorage hoặc cookie

Ví dụ JavaScript (đúng cách)

async function shortenURL(longUrl) {
  // 1. Đọc token từ hidden input (KHÔNG hardcode)
  const csrf      = document.getElementById('_csrf').value;
  const token     = document.getElementById('_token').value;
  const signature = document.getElementById('_sign').value;
  const tsToken   = document.querySelector('[name="cf-turnstile-response"]').value;

  // 2. Validate scheme trước khi gửi
  const url = new URL(longUrl);
  if (!['http:', 'https:'].includes(url.protocol)) {
    throw new Error('Invalid URL scheme');
  }

  // 3. Gọi API
  const res = await fetch('/api.php', {
    method: 'POST',
    headers: {
      'Content-Type':   'application/json',
      'X-CSRF-Token':   csrf,
      'X-Access-Token': token,
      'X-Signature':    signature,
    },
    body: JSON.stringify({
      action: 'create',
      url: longUrl,
      'cf-turnstile-response': tsToken,
    }),
  });

  // Nếu bị 404, có thể do vi phạm bảo mật hoặc lỗi hệ thống
  if (!res.ok) throw new Error('Request failed or blocked');

  const data = await res.json();

  // 4. Kiểm tra status trước khi dùng kết quả
  if (data.status !== 'success') {
    throw new Error(data.message);
  }

  // 5. Đợi 5 giây (activation delay)
  await new Promise(r => setTimeout(r, 5000));

  return data.short_url;
}

Xử lý lỗi

ℹ️ Vì lý do bảo mật, hệ thống áp dụng cơ chế Silent Failure. Mọi yêu cầu không hợp lệ (Sai token, Rate limit, URL cấm) đều trả về 404 Not Found. Bot sẽ không thể phân biệt được mình bị chặn ở bước nào.
Tình huống Phản hồi của Server Cách xử lý
Token không hợp lệ / đã dùng rồi 404 Not Found Tải lại trang để lấy token mới
Vượt giới hạn rate limit (50 link/tuần) 404 Not Found Dừng gửi request, đợi chu kỳ 7 ngày tiếp theo
URL không hợp lệ / scheme bị chặn 404 Not Found Chỉ dùng http:// hoặc https://
Lỗi xác minh Captcha Turnstile 404 Not Found Xác minh lại rằng bạn không phải là bot
Yêu cầu thành công 200 OK Nhận dữ liệu JSON và tiếp tục xử lý

Giới hạn & Bảo mật

  • 🌐 Web/API: Tối đa 50 link / 7 ngày mỗi IP.
  • ⏱️ Tự động xóa: Mọi link đều hết hạn sau 30 ngày.
  • 🤖 Bot detection: Cloudflare Turnstile + HMAC signature + Silent Failure tự động chặn script tự động