用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill linktree-security-basics命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Deploy a LangChain 1.0 / LangGraph 1.0 app to Cloud Run, Vercel, or LangServe correctly — with timeouts sized for chain length, cold-start mitigation, SSE anti-buffering headers, and Secret Manager over .env. Use when prepping a first production deploy, debugging a stream that hangs behind a proxy, or diagnosing p99 latency spikes. Trigger with "langchain deploy", "langchain cloud run", "langchain vercel python", "langchain langserve", or "langchain docker".
Build a correct LangGraph 1.0 ReAct agent with create_react_agent — typed tools, error propagation, recursion caps, and stop conditions that actually stop. Use when writing a first tool-calling agent, migrating from AgentExecutor or initialize_agent, or diagnosing an agent that loops on vague prompts. Trigger with "langgraph agent", "create_react_agent", "langgraph tool calling", "AgentExecutor migration", or "agent loop cost".
Build LangGraph 1.0 human-in-the-loop approval flows with interrupt_before / interrupt_after and Command(resume=...) — JSON-serializable state, clean resume semantics, and UI wiring for approval decisions. Use when adding an approval gate before an expensive tool call, wiring a Slack/web UI for agent approvals, or debugging a graph that crashes on interrupt. Trigger with "langgraph human in loop", "langgraph interrupt_before", "langgraph approval flow", "Command resume", "langgraph HITL".
正在显示 SKILL.md
| name | linktree-security-basics |
| description | Security Basics for Linktree. Trigger: "linktree security basics". |
| allowed-tools | Read, Write, Edit |
| version | 1.7.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
| tags | ["saas","linktree","social"] |
| compatibility | Designed for Claude Code |
Linktree integrations handle user-generated content (link titles, URLs, bios) and analytics data that is PII-adjacent — click counts, geographic breakdowns, and referrer URLs can fingerprint individual visitors. Bearer token authentication means a leaked key grants full account access including link creation, profile modification, and analytics export. Webhook payloads carry real-time event data signed with HMAC-SHA256, and failing to verify signatures opens your endpoint to spoofed events and data poisoning.
.env files in .gitignore — never committed to version control// Load Linktree bearer token from environment — never hardcode
const LINKTREE_TOKEN = process.env.LINKTREE_API_KEY;
function validateLinktreeConfig(): void {
if (!LINKTREE_TOKEN || LINKTREE_TOKEN.startsWith('lt_test_')) {
throw new Error('Missing or test-only LINKTREE_API_KEY — set a production token');
}
}
function linktreeHeaders(): Record<string, string> {
return {
Authorization: `Bearer ${LINKTREE_TOKEN}`,
'Content-Type': 'application/json',
};
}
// Call validateLinktreeConfig() at startup, before accepting requests
import crypto from 'node:crypto';
const WEBHOOK_SECRET = process.env.LINKTREE_WEBHOOK_SECRET!;
function verifyLinktreeWebhook(payload: string, signature: string): boolean {
const expected = crypto
.createHmac('sha256', WEBHOOK_SECRET)
.update(payload, 'utf8')
.digest('hex');
// Timing-safe comparison prevents timing attacks
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
// Express middleware
app.post('/webhooks/linktree', (req, res) => {
const sig = req.headers['x-linktree-signature'] as string;
if (!sig || !verifyLinktreeWebhook(JSON.stringify(req.body), sig)) {
return res.status(401).json({ error: });
}
});
import { URL } from 'node:url';
function sanitizeLinkTitle(title: string): string {
// Strip HTML/script tags from user-generated link titles
return title.replace(/<[^>]*>/g, '').trim().slice(0, 150);
}
function validateLinkUrl(url: string): boolean {
try {
const parsed = new URL(url);
// Only allow http/https — block javascript:, data:, file: schemes
return ['http:', 'https:'].includes(parsed.protocol);
} catch {
return false;
}
}
function redactAnalytics(data: Record<string, unknown>): Record<string, unknown> {
const sensitive = ['ip_address', 'user_agent', 'referrer_url', 'geo_city'];
const redacted = { ...data };
for (const field of sensitive) {
if (redacted[field]) redacted[field] = '[REDACTED]';
}
return redacted;
}
// Use redactAnalytics() before writing any analytics payload to logs
// Linktree tokens are account-scoped — enforce least privilege
function assertReadOnlyScope(operation: string): void {
const writeOps = ['create_link', 'update_link', 'delete_link', 'update_profile'];
if (writeOps.includes(operation) && process.env.LINKTREE_READ_ONLY === 'true') {
throw new Error(`Write operation "${operation}" blocked in read-only mode`);
}
}
.env on diskx-linktree-signature verified with HMAC-SHA256| Vulnerability | Risk | Mitigation |
|---|---|---|
| Bearer token in logs | Full account takeover | Redact Authorization header in all log output |
| Unverified webhooks | Spoofed link-click events | Reject any request missing valid x-linktree-signature |
| Malicious link URLs | Open redirect / phishing | Validate URL scheme and domain before storing |
| XSS in link titles | Script injection via UGC | Strip HTML tags and enforce max length |
| Analytics PII leakage | GDPR/CCPA violation | Redact IP, geo, and referrer before persistence |
See linktree-prod-checklist.