curl -L -o agent-safe-fetcher.skill "https://aiskillstore.io/v1/agent/skills/f170e245-57eb-4b65-b9a1-34eec570d5db/download?platform=ClaudeCode"
{
"tool": "download_skill",
"arguments": {
"skill_id": "f170e245-57eb-4b65-b9a1-34eec570d5db",
"platform": "ClaudeCode"
}
}
{
"mcpServers": {
"skill-store": {
"url": "https://aiskillstore.io/mcp/"
}
}
}
Safe HTTP fetcher for AI agents: fetches user-supplied URLs at runtime with built-in SSRF protection, rate limiting, robots.txt compliance, and HTML text extraction. Zero external dependencies.
Compatible Platforms any
Findings: ["메타데이터 경고: 권장 필드 없음: 'requirements' (SKILL.md v2 권장)", "메타데이터 경고: 권장 필드 없음: 'changelog' (SKILL.md v2 권장)"]
✅ No security risks found.
AI Review Stage
1. **Permissions Consistency**: 스킬 메타데이터에 선언된 `network: true` 권한은 HTTP 요청 스킬의 본질적인 요구사항과 일치합니다. `subprocess: false`는 제공된 코드 스니펫에서 외부 프로세스 실행 시도가 없어 선언과 일치합니다. `filesystem: false`는 `os` 모듈이 임포트되었으나, 스킬의 목적과 제공된 코드에서 파일 시스템 접근 흔적이 없어 선언과 일치할 것으로 판단됩니다. 2. **Malicious Code**: 제공된 코드 스니펫은 SSRF(Server-Side Request Forgery) 방어를 위한 `_is_private_ip` 함수와 도메인별 속도 제한을 위한 `_consume_token` 함수를 포함하고 있으며, 이들은 스킬의 '안전한' 목적에 부합하는 핵심 보안 기능입니다. 특히 `_is_private_ip` 함수는 광범위한 사설/예약 IP 대역을 검사하여 SSRF 공격을 효과적으로 방어합니다. 난독화나 악의적인 데이터 탈취/시스템 파괴 시도는 발견되지 않았습니다. `input_schema`에서 `Cookie` 및 `Host` 헤더를 명시적으로 제외하는 등 보안에 대한 고려가 돋보입니다. 3. **Undeclared External Communication**: 스킬의 핵심 기능이 외부 HTTP 통신이므로 `network: true` 권한은 적절하게 선언되었습니다. SSRF 보호 기능은 오히려 통신 대상을 안전한 범위로 제한하려는 목적을 가집니다. 선언되지 않은 다른 형태의 외부 통신은 발견되지 않았습니다. 4. **Unauthorized Data Collection**: 스킬은 사용자(에이전트)가 제공한 URL의 콘텐츠를 가져와 처리한 후 결과를 반환합니다. 이 과정에서 사용자 데이터를 무단으로 수집하거나 외부로 전송하는 어떠한 증거도 발견되지 않았습니다. 5. **Code Quality**: 코드는 Python 표준 라이브러리만을 사용하여 외부 의존성이 없으며, SSRF 보호 및 속도 제한 로직이 명확하고 견고하게 구현되어 있습니다. 주석과 상수 정의가 잘 되어 있어 가독성이 높고, 스킬의 '안전한 웹 페처'라는 목적에 완벽하게 부합하는 고품질 코드입니다. 정적 분석 결과 또한 'approved'로 판단되어 안전성을 뒷받침합니다.
Representative input/output examples for this skill. Agents can use these to understand how to invoke the skill and what output to expect.
https://example.com 페이지를 안전하게 조회합니다.
{
"action": "fetch",
"timeout": 5,
"url": "https://example.com"
}
{
"action": "fetch",
"body": "\u003c!doctype html\u003e...",
"content_type": "text/html; charset=UTF-8",
"elapsed_ms": 342.1,
"meta": {
"user_agent": "AISkillStore-AgentFetcher/1.0"
},
"redirect_chain": [],
"size_bytes": 1256,
"status_code": 200,
"url": "https://example.com"
}
HTML 응답에서 사람이 읽을 수 있는 텍스트만 추출합니다.
{
"action": "extract_text",
"html": "\u003chtml\u003e\u003cbody\u003e\u003ch1\u003eHello\u003c/h1\u003e\u003cp\u003eWorld\u003c/p\u003e\u003cscript\u003eevil()\u003c/script\u003e\u003c/body\u003e\u003c/html\u003e"
}
{
"action": "extract_text",
"meta": {
"tags_stripped": 4
},
"text": "Hello\nWorld"
}
robots.txt 가 Disallow 한 경로 접근 시 거부합니다.
{
"action": "fetch",
"respect_robots": true,
"url": "https://example.com/private/data"
}
{
"action": "fetch",
"error": {
"code": "ROBOTS_BLOCKED",
"message": "Blocked by robots.txt: User-agent * Disallow /private/"
},
"robots_blocked": true,
"url": "https://example.com/private/data"
}
내부 네트워크 IP(192.168.x.x) 접근 시도를 차단합니다.
{
"action": "fetch",
"url": "http://192.168.1.1/admin"
}
{
"action": "fetch",
"error": {
"code": "SSRF_BLOCKED",
"message": "SSRF protection: private/reserved IP range blocked (192.168.1.1)"
},
"url": "http://192.168.1.1/admin"
}
응답이 지정 시간 내 오지 않으면 타임아웃 에러를 반환합니다.
{
"action": "fetch",
"timeout": 3,
"url": "https://httpbin.org/delay/10"
}
{
"action": "fetch",
"error": {
"code": "TIMEOUT",
"message": "Request timed out after 3s"
},
"url": "https://httpbin.org/delay/10"
}
리디렉트를 따라가며 최종 URL 을 반환합니다.
{
"action": "fetch",
"max_redirects": 5,
"url": "http://example.com"
}
{
"action": "fetch",
"elapsed_ms": 512.3,
"redirect_chain": [
"http://example.com",
"https://example.com"
],
"status_code": 200,
"url": "http://example.com"
}
실제 요청 전에 URL 이 SSRF/HTTP 등 위험 요소를 포함하는지 검사합니다.
{
"action": "validate_url",
"url": "http://169.254.169.254/latest/meta-data/"
}
{
"action": "validate_url",
"findings": [
{
"fix_hint": {
"action": "Replace with a publicly reachable URL",
"doc_ref": "https://aiskillstore.io/skills/agent-safe-fetcher#ssrf",
"example": "https://api.example.com/data",
"summary": "Use a public URL instead"
},
"message": "Link-local address (169.254.x.x) is blocked \u2014 AWS/GCP metadata endpoint SSRF risk",
"rule": "SSRF_LINK_LOCAL",
"severity": "error"
}
],
"url": "http://169.254.169.254/latest/meta-data/",
"valid": false
}
URL 응답 헤더, 리디렉트 경로, 보안 헤더 누락 등을 종합 감사합니다.
{
"action": "audit",
"url": "https://example.com"
}
{
"action": "audit",
"elapsed_ms": 389.4,
"findings": [
{
"fix_hint": {
"action": "Set Strict-Transport-Security: max-age=31536000",
"doc_ref": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security",
"example": "Strict-Transport-Security: max-age=31536000; includeSubDomains",
"summary": "Add HSTS header on server"
},
"message": "Strict-Transport-Security header not present",
"rule": "MISSING_HSTS",
"severity": "warning"
}
],
"status_code": 200,
"url": "https://example.com"
}
All examples are also available via the agent API:
/v1/agent/skills/f170e245-57eb-4b65-b9a1-34eec570d5db/schema
No reviews yet. Be the first to leave one!