admin08077/Githubgemini
0
1{"version":3,"file":"SecurityScanner-i1gL3PXN.js","sources":["../../services/security/staticAnalysisService.ts","../../components/features/SecurityScanner.tsx"],"sourcesContent":["/**\n * @license\n * SPDX-License-Identifier: Apache-2.0\n*/\n\nexport interface SecurityIssue {\n line: number;\n type: string;\n description: string;\n severity: 'High' | 'Medium' | 'Low';\n}\n\nconst rules = [\n {\n name: 'Hardcoded Secret',\n regex: /(key|secret|token|password)['\"]?\\s*[:=]\\s*['\"]([a-zA-Z0-9-_.]{16,})['\"]/gi,\n description: 'A hardcoded secret or API key was found. These should be stored in environment variables.',\n severity: 'High' as const,\n },\n {\n name: 'dangerouslySetInnerHTML',\n regex: /dangerouslySetInnerHTML/g,\n description: 'Use of dangerouslySetInnerHTML can open your application to XSS attacks. Ensure the source is sanitized.',\n severity: 'Medium' as const,\n },\n {\n name: 'eval() usage',\n regex: /eval\\(/g,\n description: 'The use of eval() is a major security risk as it can execute arbitrary code.',\n severity: 'High' as const,\n },\n {\n name: 'Insecure URL',\n regex: /http:\\/\\//g,\n description: 'Found an insecure \"http://\" URL. Use \"https://\" for all external resources.',\n severity: 'Low' as const,\n }\n];\n\nexport const runStaticScan = (code: string): SecurityIssue[] => {\n const issues: SecurityIssue[] = [];\n const lines = code.split('\\n');\n\n lines.forEach((line, index) => {\n rules.forEach(rule => {\n if (rule.regex.test(line)) {\n issues.push({\n line: index + 1,\n type: rule.name,\n description: rule.description,\n severity: rule.severity,\n });\n }\n });\n });\n\n return issues;\n};\n","import React, { useState } from 'react';\nimport { analyzeCodeForVulnerabilities } from '../../services/aiService.ts';\nimport { runStaticScan, SecurityIssue } from '../../services/security/staticAnalysisService.ts';\nimport type { SecurityVulnerability } from '../../types.ts';\nimport { ShieldCheckIcon, SparklesIcon } from '../icons.tsx';\nimport { LoadingSpinner, MarkdownRenderer } from '../shared/index.tsx';\n\nconst exampleCode = `function UserProfile({ user }) {\n // TODO: remove this temporary api key\n const API_KEY = \"sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxx\";\n const userContent = user.bio; // This might contain malicious scripts\n\n return (\n <div>\n <h2>{user.name}</h2>\n <div dangerouslySetInnerHTML={{ __html: userContent }} />\n </div>\n );\n}`;\n\nexport const SecurityScanner: React.FC = () => {\n const [code, setCode] = useState(exampleCode);\n const [localIssues, setLocalIssues] = useState<SecurityIssue[]>([]);\n const [aiIssues, setAiIssues] = useState<SecurityVulnerability[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleScan = async () => {\n if (!code.trim()) {\n setError('Please enter code to scan.');\n return;\n }\n setIsLoading(true);\n setError('');\n setLocalIssues([]);\n setAiIssues([]);\n try {\n // Run local scan first\n const staticIssues = runStaticScan(code);\n setLocalIssues(staticIssues);\n \n // Then run AI scan\n const geminiIssues = await analyzeCodeForVulnerabilities(code);\n setAiIssues(geminiIssues);\n\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An error occurred during scanning.');\n } finally {\n setIsLoading(false);\n }\n };\n\n const SeverityBadge: React.FC<{ severity: string }> = ({ severity }) => {\n const colors: Record<string, string> = {\n 'Critical': 'bg-red-500 text-white',\n 'High': 'bg-red-400 text-white',\n 'Medium': 'bg-yellow-400 text-yellow-900',\n 'Low': 'bg-blue-400 text-white',\n 'Informational': 'bg-gray-400 text-gray-900',\n };\n return <span className={`px-2 py-0.5 text-xs font-bold rounded-full ${colors[severity] || 'bg-gray-300'}`}>{severity}</span>\n }\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-text-primary\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold flex items-center\"><ShieldCheckIcon /><span className=\"ml-3\">AI Security Co-Pilot</span></h1>\n <p className=\"text-text-secondary mt-1\">Find vulnerabilities in your code with static analysis and AI.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0\">\n <div className=\"flex flex-col\">\n <label className=\"text-sm mb-2\">Code to Scan</label>\n <textarea value={code} onChange={e => setCode(e.target.value)} className=\"w-full flex-grow p-2 bg-surface border rounded font-mono text-xs\" />\n <button onClick={handleScan} disabled={isLoading} className=\"btn-primary w-full mt-4 py-2 flex justify-center items-center gap-2\">{isLoading ? <LoadingSpinner/> : 'Scan Code'}</button>\n </div>\n <div className=\"flex flex-col bg-surface p-4 border rounded-lg\">\n <h3 className=\"text-lg font-bold mb-2\">Scan Results</h3>\n {error && <p className=\"text-red-500\">{error}</p>}\n <div className=\"flex-grow overflow-y-auto pr-2 space-y-4\">\n {isLoading && <div className=\"flex justify-center items-center h-full\"><LoadingSpinner/></div>}\n {!isLoading && localIssues.length === 0 && aiIssues.length === 0 && <p className=\"text-text-secondary text-center mt-8\">No issues found. Run a scan to begin.</p>}\n \n {localIssues.length > 0 && <div>\n <h4 className=\"font-semibold text-sm mb-1\">Static Analysis Findings</h4>\n {localIssues.map((issue, i) => <div key={`local-${i}`} className=\"p-2 bg-background border rounded mb-2\"><p className=\"font-bold flex items-center gap-2\">{issue.type} <SeverityBadge severity={issue.severity} /></p><p className=\"text-xs\">Line {issue.line}: {issue.description}</p></div>)}\n </div>}\n\n {aiIssues.length > 0 && <div>\n <h4 className=\"font-semibold text-sm mb-1 flex items-center gap-1\"><SparklesIcon/> AI-Powered Findings</h4>\n {aiIssues.map((issue, i) => (\n <details key={`ai-${i}`} className=\"p-2 bg-background border rounded mb-2\">\n <summary className=\"cursor-pointer font-bold flex items-center gap-2\">{issue.vulnerability} <SeverityBadge severity={issue.severity} /></summary>\n <div className=\"mt-2 pt-2 border-t text-xs space-y-2\">\n <p><strong>Description:</strong> {issue.description}</p>\n <p><strong>Mitigation:</strong> {issue.mitigation}</p>\n {issue.exploitSuggestion && (\n <div>\n <strong>Exploit Simulation:</strong>\n <div className=\"mt-1 p-2 bg-gray-50 rounded\">\n <MarkdownRenderer content={'```bash\\n' + issue.exploitSuggestion + '\\n```'}/>\n </div>\n </div>\n )}\n </div>\n </details>\n ))}\n </div>}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["rules","runStaticScan","code","issues","line","index","rule","exampleCode","SecurityScanner","setCode","useState","localIssues","setLocalIssues","aiIssues","setAiIssues","isLoading","setIsLoading","error","setError","handleScan","staticIssues","geminiIssues","analyzeCodeForVulnerabilities","err","SeverityBadge","severity","colors","jsx","jsxs","ShieldCheckIcon","e","LoadingSpinner","issue","i","SparklesIcon","MarkdownRenderer"],"mappings":"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"}