aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/advanced_queries.py120
-rw-r--r--examples/basic_usage.py74
2 files changed, 194 insertions, 0 deletions
diff --git a/examples/advanced_queries.py b/examples/advanced_queries.py
new file mode 100644
index 0000000..46035c7
--- /dev/null
+++ b/examples/advanced_queries.py
@@ -0,0 +1,120 @@
+"""Advanced query examples for nvdb-py."""
+
+import asyncio
+from datetime import datetime, timedelta
+
+from nvd import NVDClient
+
+
+async def main() -> None:
+ """Run advanced examples."""
+ async with NVDClient() as client:
+ print("=" * 80)
+ print("Example 1: CVEs in CISA KEV catalog with HIGH severity")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(
+ has_kev=True, cvss_v3_severity="HIGH"
+ ):
+ print(f"{cve.id} - Score: {cve.cvss_v3_score}")
+ count += 1
+ if count >= 5:
+ break
+ print(f"Showing {count} results\n")
+
+ print("=" * 80)
+ print("Example 2: CVEs for specific CPE (Apache Log4j)")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(
+ cpe_name="cpe:2.3:a:apache:log4j:2.14.1:*:*:*:*:*:*:*"
+ ):
+ print(f"{cve.id}: {cve.description[:100]}...")
+ count += 1
+ if count >= 5:
+ break
+ print(f"Showing {count} results\n")
+
+ print("=" * 80)
+ print("Example 3: Recent CVEs (last 30 days)")
+ print("=" * 80)
+
+ # Calculate date range
+ end_date = datetime.utcnow()
+ start_date = end_date - timedelta(days=30)
+
+ # Format for NVD API
+ start_str = start_date.strftime("%Y-%m-%dT%H:%M:%S.000")
+ end_str = end_date.strftime("%Y-%m-%dT%H:%M:%S.000")
+
+ count = 0
+ async for cve in client.cve.search_cves(
+ pub_start_date=start_str, pub_end_date=end_str
+ ):
+ print(f"{cve.id} - Published: {cve.published.date()}")
+ count += 1
+ if count >= 10:
+ break
+ print(f"Showing {count} results\n")
+
+ print("=" * 80)
+ print("Example 4: CVEs with specific CWE (Cross-Site Scripting)")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(cwe_id="CWE-79"):
+ print(f"{cve.id}: {cve.description[:100]}...")
+ count += 1
+ if count >= 5:
+ break
+ print(f"Showing {count} results\n")
+
+ print("=" * 80)
+ print("Example 5: CPE match criteria for a CVE")
+ print("=" * 80)
+
+ matches = await client.cpematch.get_cve_match_criteria("CVE-2021-44228")
+ print(f"Found {len(matches)} match criteria for CVE-2021-44228")
+ for match in matches[:5]:
+ print(f" {match.criteria}")
+ if match.versionEndExcluding:
+ print(f" Versions: < {match.versionEndExcluding}")
+ print()
+
+ print("=" * 80)
+ print("Example 6: Search with multiple filters")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(
+ keyword="remote",
+ cvss_v3_severity="CRITICAL",
+ has_cert_alerts=True,
+ ):
+ print(
+ f"{cve.id} - Score: {cve.cvss_v3_score} - {cve.description[:80]}..."
+ )
+ count += 1
+ if count >= 5:
+ break
+ print(f"Showing {count} results\n")
+
+ print("=" * 80)
+ print("Example 7: List data sources")
+ print("=" * 80)
+
+ count = 0
+ async for source in client.source.list_sources():
+ print(f"{source.name}")
+ print(f" Contact: {source.contactEmail}")
+ print(f" Identifiers: {', '.join(source.sourceIdentifiers[:3])}")
+ count += 1
+ if count >= 5:
+ break
+ print(f"Showing {count} results\n")
+
+
+if __name__ == "__main__":
+ asyncio.run(main())
diff --git a/examples/basic_usage.py b/examples/basic_usage.py
new file mode 100644
index 0000000..b386155
--- /dev/null
+++ b/examples/basic_usage.py
@@ -0,0 +1,74 @@
+"""Basic usage examples for nvdb-py."""
+
+import asyncio
+
+from nvd import NVDClient
+
+
+async def main() -> None:
+ """Run basic examples."""
+ async with NVDClient() as client:
+ print("=" * 80)
+ print("Example 1: Get a specific CVE")
+ print("=" * 80)
+
+ cve = await client.cve.get_cve("CVE-2021-44228")
+ print(f"CVE ID: {cve.id}")
+ print(f"Published: {cve.published}")
+ print(f"Status: {cve.vulnStatus}")
+ print(f"CVSS v3 Score: {cve.cvss_v3_score}")
+ print(f"Description: {cve.description[:200]}...")
+ print()
+
+ print("=" * 80)
+ print("Example 2: Search CVEs by keyword (limited to 5 results)")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(keyword="sql injection"):
+ print(f"{cve.id}: {cve.description[:100]}...")
+ count += 1
+ if count >= 5:
+ break
+ print()
+
+ print("=" * 80)
+ print("Example 3: Get CVEs with CRITICAL severity (limited to 5)")
+ print("=" * 80)
+
+ count = 0
+ async for cve in client.cve.search_cves(cvss_v3_severity="CRITICAL"):
+ score = cve.cvss_v3_score or "N/A"
+ print(f"{cve.id} - Score: {score} - {cve.description[:80]}...")
+ count += 1
+ if count >= 5:
+ break
+ print()
+
+ print("=" * 80)
+ print("Example 4: Search CPEs by keyword")
+ print("=" * 80)
+
+ count = 0
+ async for cpe in client.cpe.search_cpes(keyword="apache"):
+ print(f"{cpe.cpeName}")
+ print(f" Title: {cpe.title}")
+ print(f" Deprecated: {cpe.deprecated}")
+ count += 1
+ if count >= 5:
+ break
+ print()
+
+ print("=" * 80)
+ print("Example 5: Get CVE change history")
+ print("=" * 80)
+
+ history = await client.history.get_cve_history("CVE-2021-44228")
+ print(f"Found {len(history)} change events for CVE-2021-44228")
+ for change in history[:3]:
+ print(f" {change.eventName} at {change.created}")
+ print()
+
+
+if __name__ == "__main__":
+ asyncio.run(main())