@tinkcarlos/skillora 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,800 @@
|
|
|
1
|
+
# Multi-Language Code Review Best Practices Guide
|
|
2
|
+
|
|
3
|
+
> Based on the latest code review standards and tools from major language communities (2024-2025)
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Universal Review Principles](#universal-review-principles)
|
|
8
|
+
- [Python](#python)
|
|
9
|
+
- [TypeScript / JavaScript](#typescript--javascript)
|
|
10
|
+
- [React](#react)
|
|
11
|
+
- [Vue.js](#vuejs)
|
|
12
|
+
- [Angular](#angular)
|
|
13
|
+
- [Go](#go)
|
|
14
|
+
- [Java / Spring Boot](#java--spring-boot)
|
|
15
|
+
- [Rust](#rust)
|
|
16
|
+
- [C# / .NET](#c--net)
|
|
17
|
+
- [Multi-Language Security Checklist](#multi-language-security-checklist)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Universal Review Principles
|
|
22
|
+
|
|
23
|
+
### OWASP Top 10 Security Checks (Applicable to All Languages)
|
|
24
|
+
|
|
25
|
+
| Vulnerability Type | Check Points | Tools |
|
|
26
|
+
|-------------------|--------------|-------|
|
|
27
|
+
| **Injection Attacks** | SQL/Command/LDAP injection, parameterized queries | Bandit, ESLint-security |
|
|
28
|
+
| **Authentication Failure** | Password storage, session management, token expiry | Security scanners |
|
|
29
|
+
| **Sensitive Data Exposure** | Encryption algorithms, TLS config, log scrubbing | Code search |
|
|
30
|
+
| **XXE** | XML parser config, disable external entities | SAST tools |
|
|
31
|
+
| **Access Control** | Permission checks, least privilege principle | Manual review |
|
|
32
|
+
| **Security Config** | Default config, error message leakage | Config scan |
|
|
33
|
+
| **XSS** | Output encoding, CSP policy | ESLint, DOMPurify |
|
|
34
|
+
| **Deserialization** | Deserialization of untrusted data | Static analysis |
|
|
35
|
+
| **Component Vulnerabilities** | Dependency versions, known vulnerabilities | npm audit, Snyk |
|
|
36
|
+
| **Logging & Monitoring** | Audit logs, anomaly detection | Log audit |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Python
|
|
41
|
+
|
|
42
|
+
### Tool Stack
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# Install complete toolchain
|
|
46
|
+
pip install pylint flake8 bandit mypy black isort
|
|
47
|
+
|
|
48
|
+
# Run checks
|
|
49
|
+
pylint src/
|
|
50
|
+
flake8 src/
|
|
51
|
+
mypy src/
|
|
52
|
+
bandit -r src/ # Security scan
|
|
53
|
+
black --check src/ # Format check
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Key Checklist
|
|
57
|
+
|
|
58
|
+
| Category | Check Item | Incorrect Example | Correct Example |
|
|
59
|
+
|----------|------------|-------------------|-----------------|
|
|
60
|
+
| **Readability** | PEP 8 naming conventions | `def Calc_Area(r):` | `def calculate_area(radius):` |
|
|
61
|
+
| **Type Safety** | Type annotations | `def add(a, b):` | `def add(a: int, b: int) -> int:` |
|
|
62
|
+
| **Security** | SQL injection | `f"SELECT * FROM users WHERE id={id}"` | `cursor.execute("SELECT * FROM users WHERE id=?", (id,))` |
|
|
63
|
+
| **Security** | Hardcoded credentials | `API_KEY = "sk-123..."` | `API_KEY = os.environ.get("API_KEY")` |
|
|
64
|
+
| **Error Handling** | Exception catching | `except Exception: pass` | `except FileNotFoundError: logger.error(...); raise` |
|
|
65
|
+
| **Resource Management** | Context managers | `file = open("data.txt")` | `with open("data.txt") as file:` |
|
|
66
|
+
|
|
67
|
+
### Common Pitfalls
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
# ❌ Mutable default arguments - Most common Python bug
|
|
71
|
+
def append_to(element, to=[]): # Default list created once at function definition
|
|
72
|
+
to.append(element)
|
|
73
|
+
return to
|
|
74
|
+
|
|
75
|
+
# ✅ Correct approach
|
|
76
|
+
def append_to(element, to=None):
|
|
77
|
+
if to is None:
|
|
78
|
+
to = []
|
|
79
|
+
to.append(element)
|
|
80
|
+
return to
|
|
81
|
+
|
|
82
|
+
# ❌ Late binding in closures
|
|
83
|
+
funcs = [lambda x: x * i for i in range(3)]
|
|
84
|
+
# funcs[0](1), funcs[1](1), funcs[2](1) all return 2
|
|
85
|
+
|
|
86
|
+
# ✅ Correct approach
|
|
87
|
+
funcs = [lambda x, i=i: x * i for i in range(3)]
|
|
88
|
+
|
|
89
|
+
# ❌ Modifying list while iterating
|
|
90
|
+
items = [1, 2, 3, 4, 5]
|
|
91
|
+
for item in items:
|
|
92
|
+
if item % 2 == 0:
|
|
93
|
+
items.remove(item) # Skips elements
|
|
94
|
+
|
|
95
|
+
# ✅ Correct approach
|
|
96
|
+
items = [item for item in items if item % 2 != 0]
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### FastAPI/Django Specific Checks
|
|
100
|
+
|
|
101
|
+
| Framework | Check Item | Risk |
|
|
102
|
+
|-----------|------------|------|
|
|
103
|
+
| **FastAPI** | Blocking calls in async functions | Event loop blocking |
|
|
104
|
+
| **FastAPI** | Dependency injection order | Resources not properly cleaned |
|
|
105
|
+
| **Django** | `select_related` / `prefetch_related` | N+1 queries |
|
|
106
|
+
| **Django** | CSRF protection | CSRF attacks |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## TypeScript / JavaScript
|
|
111
|
+
|
|
112
|
+
### Tool Stack
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# Install toolchain
|
|
116
|
+
npm install -D eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin
|
|
117
|
+
|
|
118
|
+
# ESLint config (eslint.config.js)
|
|
119
|
+
import js from "@eslint/js";
|
|
120
|
+
import tseslint from "typescript-eslint";
|
|
121
|
+
|
|
122
|
+
export default tseslint.config({
|
|
123
|
+
files: ["**/*.ts", "**/*.tsx"],
|
|
124
|
+
extends: [
|
|
125
|
+
js.configs.recommended,
|
|
126
|
+
tseslint.configs.recommended,
|
|
127
|
+
],
|
|
128
|
+
rules: {
|
|
129
|
+
"@typescript-eslint/no-explicit-any": "error",
|
|
130
|
+
"@typescript-eslint/explicit-function-return-type": "warn",
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Key Checklist
|
|
136
|
+
|
|
137
|
+
| Category | Check Item | Incorrect Example | Correct Example |
|
|
138
|
+
|----------|------------|-------------------|-----------------|
|
|
139
|
+
| **Type Safety** | Avoid any | `function process(data: any)` | `function process(data: UserData)` |
|
|
140
|
+
| **Null Handling** | Optional chaining | `user.profile.name` | `user?.profile?.name` |
|
|
141
|
+
| **Equality** | Strict equality | `if (a == b)` | `if (a === b)` |
|
|
142
|
+
| **Promise** | Error handling | `promise.then(...)` | `promise.then(...).catch(...)` |
|
|
143
|
+
| **Async** | await usage | `async function f() { return promise }` | `async function f() { return await promise }` |
|
|
144
|
+
|
|
145
|
+
### Common Pitfalls
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// ❌ Closure trap - this context lost
|
|
149
|
+
class Counter {
|
|
150
|
+
count = 0;
|
|
151
|
+
increment() {
|
|
152
|
+
setTimeout(function() {
|
|
153
|
+
this.count++; // this is undefined or window
|
|
154
|
+
}, 100);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// ✅ Correct approach
|
|
159
|
+
class Counter {
|
|
160
|
+
count = 0;
|
|
161
|
+
increment() {
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
this.count++; // Arrow function preserves this context
|
|
164
|
+
}, 100);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ❌ Unhandled Promise rejection
|
|
169
|
+
async function fetchData() {
|
|
170
|
+
const response = await fetch('/api/data');
|
|
171
|
+
return response.json(); // Didn't check response.ok
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// ✅ Correct approach
|
|
175
|
+
async function fetchData() {
|
|
176
|
+
const response = await fetch('/api/data');
|
|
177
|
+
if (!response.ok) {
|
|
178
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
179
|
+
}
|
|
180
|
+
return response.json();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// ❌ Array mutation method misuse
|
|
184
|
+
const original = [3, 1, 2];
|
|
185
|
+
const sorted = original.sort(); // original is also modified!
|
|
186
|
+
|
|
187
|
+
// ✅ Correct approach
|
|
188
|
+
const sorted = [...original].sort();
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## React
|
|
194
|
+
|
|
195
|
+
### Tool Stack
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# Install React Hooks ESLint plugin
|
|
199
|
+
npm install -D eslint-plugin-react-hooks
|
|
200
|
+
|
|
201
|
+
# ESLint configuration
|
|
202
|
+
{
|
|
203
|
+
"plugins": ["react-hooks"],
|
|
204
|
+
"rules": {
|
|
205
|
+
"react-hooks/rules-of-hooks": "error",
|
|
206
|
+
"react-hooks/exhaustive-deps": "warn"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Hooks Rules Check (Most Important)
|
|
212
|
+
|
|
213
|
+
| Rule | Incorrect Example | Explanation |
|
|
214
|
+
|------|-------------------|-------------|
|
|
215
|
+
| **Hook in condition** | `if (cond) { const [x] = useState(0) }` | Hooks must be called at top level |
|
|
216
|
+
| **Hook in loop** | `for (...) { useEffect(...) }` | Hook call order must be consistent |
|
|
217
|
+
| **Hook in nested function** | `function handler() { useState(0) }` | Hooks can only be called in components or custom hooks |
|
|
218
|
+
| **Hook in class component** | `class C { render() { useEffect() } }` | Hooks cannot be used in class components |
|
|
219
|
+
|
|
220
|
+
### Performance Pitfalls
|
|
221
|
+
|
|
222
|
+
```tsx
|
|
223
|
+
// ❌ useMemo vs useEffect misuse - Most common React performance issue
|
|
224
|
+
const Component = ({ items }) => {
|
|
225
|
+
const [computedValue, setComputedValue] = useState(0);
|
|
226
|
+
|
|
227
|
+
// Wrong: Using useEffect to set derived state
|
|
228
|
+
useEffect(() => {
|
|
229
|
+
setComputedValue(items.reduce((sum, item) => sum + item.value, 0));
|
|
230
|
+
}, [items]);
|
|
231
|
+
|
|
232
|
+
return <div>{computedValue}</div>;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
// ✅ Correct: Use useMemo for derived values
|
|
236
|
+
const Component = ({ items }) => {
|
|
237
|
+
const computedValue = useMemo(() => {
|
|
238
|
+
return items.reduce((sum, item) => sum + item.value, 0);
|
|
239
|
+
}, [items]);
|
|
240
|
+
|
|
241
|
+
return <div>{computedValue}</div>;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// ❌ Incomplete useEffect dependencies
|
|
245
|
+
useEffect(() => {
|
|
246
|
+
const options = createOptions(); // Changes every render
|
|
247
|
+
const connection = createConnection(options);
|
|
248
|
+
connection.connect();
|
|
249
|
+
return () => connection.disconnect();
|
|
250
|
+
}, [createOptions]); // Dependency changes every time!
|
|
251
|
+
|
|
252
|
+
// ✅ Correct: Use useCallback to stabilize function reference
|
|
253
|
+
const createOptions = useCallback(() => {
|
|
254
|
+
return { serverUrl, roomId };
|
|
255
|
+
}, [serverUrl, roomId]);
|
|
256
|
+
|
|
257
|
+
// ❌ Missing cleanup function - Memory leak
|
|
258
|
+
useEffect(() => {
|
|
259
|
+
const subscription = eventSource.subscribe(handler);
|
|
260
|
+
// No cleanup!
|
|
261
|
+
}, []);
|
|
262
|
+
|
|
263
|
+
// ✅ Correct: Return cleanup function
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
const subscription = eventSource.subscribe(handler);
|
|
266
|
+
return () => subscription.unsubscribe();
|
|
267
|
+
}, []);
|
|
268
|
+
|
|
269
|
+
// ❌ Non-unique key or using index as key
|
|
270
|
+
{items.map((item, index) => (
|
|
271
|
+
<Item key={index} data={item} /> // Problems with reordering
|
|
272
|
+
))}
|
|
273
|
+
|
|
274
|
+
// ✅ Correct: Use stable unique key
|
|
275
|
+
{items.map((item) => (
|
|
276
|
+
<Item key={item.id} data={item} />
|
|
277
|
+
))}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Security Checks
|
|
281
|
+
|
|
282
|
+
```tsx
|
|
283
|
+
// ❌ XSS risk - dangerouslySetInnerHTML
|
|
284
|
+
const MarkdownPreview = ({ content }) => {
|
|
285
|
+
// User-provided content may contain malicious scripts
|
|
286
|
+
return <div dangerouslySetInnerHTML={{ __html: content }} />;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
// ✅ Correct: Use DOMPurify to sanitize
|
|
290
|
+
import DOMPurify from 'dompurify';
|
|
291
|
+
|
|
292
|
+
const MarkdownPreview = ({ content }) => {
|
|
293
|
+
const sanitizedHtml = DOMPurify.sanitize(content);
|
|
294
|
+
return <div dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />;
|
|
295
|
+
};
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Vue.js
|
|
301
|
+
|
|
302
|
+
### XSS Protection Check (Most Important)
|
|
303
|
+
|
|
304
|
+
```vue
|
|
305
|
+
<!-- ❌ XSS risk - v-html with user input -->
|
|
306
|
+
<template>
|
|
307
|
+
<span v-html="userInput" /> <!-- Dangerous! -->
|
|
308
|
+
</template>
|
|
309
|
+
|
|
310
|
+
<!-- ✅ Correct: Use DOMPurify or v-dompurify-html -->
|
|
311
|
+
<template>
|
|
312
|
+
<div v-dompurify-html="userInput"></div>
|
|
313
|
+
</template>
|
|
314
|
+
|
|
315
|
+
<script setup>
|
|
316
|
+
import { ref } from 'vue';
|
|
317
|
+
// npm install vue-dompurify-html
|
|
318
|
+
const userInput = ref('<span style="color: red">Safe</span>');
|
|
319
|
+
</script>
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Key Checklist
|
|
323
|
+
|
|
324
|
+
| Category | Check Item | Risk |
|
|
325
|
+
|----------|------------|------|
|
|
326
|
+
| **XSS** | `v-html` with user input | XSS attack |
|
|
327
|
+
| **URL Injection** | `:href="userProvidedUrl"` | javascript: protocol attack |
|
|
328
|
+
| **Style Injection** | `:style="userProvidedStyle"` | CSS injection attack |
|
|
329
|
+
| **Template Injection** | Server-side rendering of user input | Template injection attack |
|
|
330
|
+
| **v-if/v-for** | Using both on same element | Performance issues, priority issues |
|
|
331
|
+
| **Reactivity Loss** | Destructuring props or reactive objects | Reactivity loss |
|
|
332
|
+
|
|
333
|
+
### Common Pitfalls
|
|
334
|
+
|
|
335
|
+
```vue
|
|
336
|
+
<script setup>
|
|
337
|
+
import { reactive, toRefs } from 'vue';
|
|
338
|
+
|
|
339
|
+
// ❌ Reactivity loss
|
|
340
|
+
const state = reactive({ count: 0 });
|
|
341
|
+
const { count } = state; // count is no longer reactive
|
|
342
|
+
|
|
343
|
+
// ✅ Correct: Use toRefs
|
|
344
|
+
const { count } = toRefs(state); // count is reactive
|
|
345
|
+
|
|
346
|
+
// ❌ Lifecycle cleanup omission
|
|
347
|
+
onMounted(() => {
|
|
348
|
+
window.addEventListener('resize', handleResize);
|
|
349
|
+
// No cleanup!
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// ✅ Correct: Clean up in onUnmounted
|
|
353
|
+
onMounted(() => {
|
|
354
|
+
window.addEventListener('resize', handleResize);
|
|
355
|
+
});
|
|
356
|
+
onUnmounted(() => {
|
|
357
|
+
window.removeEventListener('resize', handleResize);
|
|
358
|
+
});
|
|
359
|
+
</script>
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
364
|
+
## Angular
|
|
365
|
+
|
|
366
|
+
### Security Configuration Check
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
// ✅ XSRF protection configuration
|
|
370
|
+
import { provideHttpClient, withXsrfConfiguration } from '@angular/common/http';
|
|
371
|
+
|
|
372
|
+
export const appConfig: ApplicationConfig = {
|
|
373
|
+
providers: [
|
|
374
|
+
provideHttpClient(
|
|
375
|
+
withXsrfConfiguration({
|
|
376
|
+
cookieName: 'XSRF-TOKEN',
|
|
377
|
+
headerName: 'X-XSRF-TOKEN'
|
|
378
|
+
})
|
|
379
|
+
),
|
|
380
|
+
]
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
// ✅ Secure HTTP interceptor
|
|
384
|
+
@Injectable()
|
|
385
|
+
export class AuthInterceptor implements HttpInterceptor {
|
|
386
|
+
intercept(req: HttpRequest<any>, next: HttpHandler) {
|
|
387
|
+
const token = localStorage.getItem('authToken');
|
|
388
|
+
const clonedReq = token
|
|
389
|
+
? req.clone({
|
|
390
|
+
setHeaders: { Authorization: `Bearer ${token}` },
|
|
391
|
+
})
|
|
392
|
+
: req;
|
|
393
|
+
return next.handle(clonedReq);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
### XSS Protection
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
// Angular escapes HTML by default for bound values
|
|
402
|
+
// ❌ Dangerous: Bypassing security check
|
|
403
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
404
|
+
|
|
405
|
+
@Component({...})
|
|
406
|
+
export class MyComponent {
|
|
407
|
+
constructor(private sanitizer: DomSanitizer) {}
|
|
408
|
+
|
|
409
|
+
// Dangerous! Only use when content is guaranteed safe
|
|
410
|
+
trustedHtml = this.sanitizer.bypassSecurityTrustHtml(userInput);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// ✅ Correct: Let Angular handle escaping
|
|
414
|
+
@Component({
|
|
415
|
+
template: `<div>{{ userInput }}</div>` // Auto-escaped
|
|
416
|
+
})
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Go
|
|
422
|
+
|
|
423
|
+
### Tool Stack
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
# Install golangci-lint
|
|
427
|
+
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
428
|
+
|
|
429
|
+
# Run checks
|
|
430
|
+
golangci-lint run ./...
|
|
431
|
+
|
|
432
|
+
# Data race detection (Most Important)
|
|
433
|
+
go test -race ./...
|
|
434
|
+
go run -race main.go
|
|
435
|
+
go build -race
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Concurrency Safety Check (Most Important)
|
|
439
|
+
|
|
440
|
+
```go
|
|
441
|
+
// ❌ Data race - Go's most dangerous hidden bug
|
|
442
|
+
package main
|
|
443
|
+
|
|
444
|
+
import (
|
|
445
|
+
"fmt"
|
|
446
|
+
"sync"
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
var counter int // Shared state
|
|
450
|
+
|
|
451
|
+
func main() {
|
|
452
|
+
var wg sync.WaitGroup
|
|
453
|
+
for i := 0; i < 1000; i++ {
|
|
454
|
+
wg.Add(1)
|
|
455
|
+
go func() {
|
|
456
|
+
counter++ // Data race!
|
|
457
|
+
wg.Done()
|
|
458
|
+
}()
|
|
459
|
+
}
|
|
460
|
+
wg.Wait()
|
|
461
|
+
fmt.Println(counter) // Result is non-deterministic
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// ✅ Correct: Use Mutex
|
|
465
|
+
var (
|
|
466
|
+
counter int
|
|
467
|
+
mu sync.Mutex
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
func increment() {
|
|
471
|
+
mu.Lock()
|
|
472
|
+
counter++
|
|
473
|
+
mu.Unlock()
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// ✅ Or use atomic operations
|
|
477
|
+
import "sync/atomic"
|
|
478
|
+
|
|
479
|
+
var counter int64
|
|
480
|
+
|
|
481
|
+
func increment() {
|
|
482
|
+
atomic.AddInt64(&counter, 1)
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// ❌ Concurrent map access - fatal error
|
|
486
|
+
m := make(map[int]int)
|
|
487
|
+
go func() { m[1] = 1 }() // Write
|
|
488
|
+
go func() { _ = m[1] }() // Read
|
|
489
|
+
// fatal error: concurrent map read and map write
|
|
490
|
+
|
|
491
|
+
// ✅ Correct: Use sync.Map
|
|
492
|
+
var m sync.Map
|
|
493
|
+
m.Store(1, 1)
|
|
494
|
+
v, _ := m.Load(1)
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### Key Checklist
|
|
498
|
+
|
|
499
|
+
| Category | Check Item | Detection Method |
|
|
500
|
+
|----------|------------|------------------|
|
|
501
|
+
| **Data Race** | Shared variable concurrent access | `go test -race` |
|
|
502
|
+
| **Goroutine Leak** | Unclosed channels | Code review |
|
|
503
|
+
| **Deadlock** | Mutex nested locking | go-deadlock library |
|
|
504
|
+
| **Map Concurrency** | Non-thread-safe map | `go build -race` |
|
|
505
|
+
| **Error Handling** | Ignored returned errors | golangci-lint |
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
## Java / Spring Boot
|
|
510
|
+
|
|
511
|
+
### Tool Stack
|
|
512
|
+
|
|
513
|
+
```xml
|
|
514
|
+
<!-- Maven configuration -->
|
|
515
|
+
<plugin>
|
|
516
|
+
<groupId>com.github.spotbugs</groupId>
|
|
517
|
+
<artifactId>spotbugs-maven-plugin</artifactId>
|
|
518
|
+
<version>4.8.3</version>
|
|
519
|
+
</plugin>
|
|
520
|
+
<plugin>
|
|
521
|
+
<groupId>org.apache.maven.plugins</groupId>
|
|
522
|
+
<artifactId>maven-checkstyle-plugin</artifactId>
|
|
523
|
+
<version>3.3.0</version>
|
|
524
|
+
</plugin>
|
|
525
|
+
|
|
526
|
+
<!-- Dependency vulnerability check -->
|
|
527
|
+
<plugin>
|
|
528
|
+
<groupId>org.owasp</groupId>
|
|
529
|
+
<artifactId>dependency-check-maven</artifactId>
|
|
530
|
+
<version>9.0.0</version>
|
|
531
|
+
</plugin>
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
```bash
|
|
535
|
+
# Run checks
|
|
536
|
+
mvn spotbugs:check
|
|
537
|
+
mvn checkstyle:check
|
|
538
|
+
mvn org.owasp:dependency-check-maven:check
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
### Key Checklist
|
|
542
|
+
|
|
543
|
+
| Category | Check Item | SpotBugs Rule |
|
|
544
|
+
|----------|------------|---------------|
|
|
545
|
+
| **Null Pointer** | NPE risk | NP_NULL_ON_SOME_PATH |
|
|
546
|
+
| **Resource Leak** | Unclosed streams/connections | OBL_UNSATISFIED_OBLIGATION |
|
|
547
|
+
| **Concurrency** | Non-thread-safe usage | IS2_INCONSISTENT_SYNC |
|
|
548
|
+
| **Security** | SQL injection | SQL_INJECTION_* |
|
|
549
|
+
| **Performance** | Inefficient loops | WMI_WRONG_MAP_ITERATOR |
|
|
550
|
+
|
|
551
|
+
### Spring Boot Security Check
|
|
552
|
+
|
|
553
|
+
```java
|
|
554
|
+
// ❌ SQL injection risk
|
|
555
|
+
@Repository
|
|
556
|
+
public class UserRepository {
|
|
557
|
+
public User findByUsername(String username) {
|
|
558
|
+
String sql = "SELECT * FROM users WHERE username = '" + username + "'";
|
|
559
|
+
return jdbcTemplate.queryForObject(sql, new UserRowMapper());
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// ✅ Correct: Use parameterized queries
|
|
564
|
+
@Repository
|
|
565
|
+
public class UserRepository {
|
|
566
|
+
public User findByUsername(String username) {
|
|
567
|
+
String sql = "SELECT * FROM users WHERE username = ?";
|
|
568
|
+
return jdbcTemplate.queryForObject(sql, new UserRowMapper(), username);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// ✅ Or use JPA
|
|
573
|
+
@Repository
|
|
574
|
+
public interface UserRepository extends JpaRepository<User, Long> {
|
|
575
|
+
@Query("SELECT u FROM User u WHERE u.username = :username")
|
|
576
|
+
User findByUsername(@Param("username") String username);
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## Rust
|
|
583
|
+
|
|
584
|
+
### Tool Stack
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
# Clippy - Rust official linter
|
|
588
|
+
cargo clippy --all-targets --all-features -- -D warnings
|
|
589
|
+
|
|
590
|
+
# Auto-fix
|
|
591
|
+
cargo clippy --fix --all-targets --all-features
|
|
592
|
+
|
|
593
|
+
# Security audit
|
|
594
|
+
cargo audit
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
### Clippy Configuration (Recommended to Enable)
|
|
598
|
+
|
|
599
|
+
```rust
|
|
600
|
+
// Cargo.toml or top of lib.rs
|
|
601
|
+
#![warn(
|
|
602
|
+
// Arithmetic safety
|
|
603
|
+
clippy::cast_possible_truncation,
|
|
604
|
+
clippy::cast_sign_loss,
|
|
605
|
+
clippy::cast_possible_wrap,
|
|
606
|
+
clippy::arithmetic_side_effects,
|
|
607
|
+
|
|
608
|
+
// Error handling
|
|
609
|
+
clippy::unwrap_used,
|
|
610
|
+
clippy::expect_used,
|
|
611
|
+
clippy::panicking_unwrap,
|
|
612
|
+
|
|
613
|
+
// Array index safety
|
|
614
|
+
clippy::indexing_slicing,
|
|
615
|
+
)]
|
|
616
|
+
|
|
617
|
+
// ❌ Dangerous: Using unwrap directly
|
|
618
|
+
fn get_user(id: u64) -> User {
|
|
619
|
+
users.get(&id).unwrap() // May panic
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// ✅ Correct: Return Option or Result
|
|
623
|
+
fn get_user(id: u64) -> Option<&User> {
|
|
624
|
+
users.get(&id)
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// ✅ Or use ? operator
|
|
628
|
+
fn get_user(id: u64) -> Result<&User, Error> {
|
|
629
|
+
users.get(&id).ok_or(Error::NotFound)
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
### Unsafe Code Review
|
|
634
|
+
|
|
635
|
+
```rust
|
|
636
|
+
// Unsafe code review checklist:
|
|
637
|
+
// 1. Necessity: Is unsafe really needed? Are there safe alternatives?
|
|
638
|
+
// 2. Minimal scope: Is the unsafe block as small as possible?
|
|
639
|
+
// 3. Documentation: Is there # Safety documentation explaining preconditions?
|
|
640
|
+
// 4. Testing: Is there Miri testing?
|
|
641
|
+
|
|
642
|
+
// ✅ Correct unsafe usage pattern
|
|
643
|
+
/// # Safety
|
|
644
|
+
///
|
|
645
|
+
/// - `ptr` must be a valid pointer to initialized memory
|
|
646
|
+
/// - The memory must not be mutably aliased
|
|
647
|
+
unsafe fn dereference(ptr: *const i32) -> i32 {
|
|
648
|
+
// SAFETY: Caller guarantees ptr is valid and not aliased
|
|
649
|
+
*ptr
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
---
|
|
654
|
+
|
|
655
|
+
## C# / .NET
|
|
656
|
+
|
|
657
|
+
### Tool Stack
|
|
658
|
+
|
|
659
|
+
```xml
|
|
660
|
+
<!-- .csproj configuration -->
|
|
661
|
+
<PropertyGroup>
|
|
662
|
+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
663
|
+
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
|
|
664
|
+
</PropertyGroup>
|
|
665
|
+
|
|
666
|
+
<ItemGroup>
|
|
667
|
+
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="8.0.0">
|
|
668
|
+
<PrivateAssets>all</PrivateAssets>
|
|
669
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
|
670
|
+
</PackageReference>
|
|
671
|
+
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556">
|
|
672
|
+
<PrivateAssets>all</PrivateAssets>
|
|
673
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
|
674
|
+
</PackageReference>
|
|
675
|
+
<PackageReference Include="Roslynator.Analyzers" Version="4.14.1">
|
|
676
|
+
<PrivateAssets>all</PrivateAssets>
|
|
677
|
+
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
|
678
|
+
</PackageReference>
|
|
679
|
+
</ItemGroup>
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
```bash
|
|
683
|
+
# Run analysis
|
|
684
|
+
dotnet build
|
|
685
|
+
|
|
686
|
+
# Security audit
|
|
687
|
+
dotnet list package --vulnerable
|
|
688
|
+
|
|
689
|
+
# Roslynator CLI
|
|
690
|
+
roslynator analyze MyProject.csproj
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
### .editorconfig Configuration
|
|
694
|
+
|
|
695
|
+
```ini
|
|
696
|
+
[*.cs]
|
|
697
|
+
# Enable all .NET analyzers
|
|
698
|
+
dotnet_analyzer_diagnostic.severity = warning
|
|
699
|
+
|
|
700
|
+
# Set security rules as errors
|
|
701
|
+
dotnet_diagnostic.CA2100.severity = error # SQL injection
|
|
702
|
+
dotnet_diagnostic.CA3001.severity = error # SQL injection
|
|
703
|
+
dotnet_diagnostic.CA3002.severity = error # XSS
|
|
704
|
+
dotnet_diagnostic.CA3003.severity = error # File path injection
|
|
705
|
+
dotnet_diagnostic.CA3004.severity = error # Information disclosure
|
|
706
|
+
|
|
707
|
+
# Code quality
|
|
708
|
+
dotnet_diagnostic.IDE0090.severity = warning # Use new(...)
|
|
709
|
+
dotnet_diagnostic.IDE0028.severity = warning # Simplify collection initialization
|
|
710
|
+
```
|
|
711
|
+
|
|
712
|
+
### Key Checklist
|
|
713
|
+
|
|
714
|
+
```csharp
|
|
715
|
+
// ❌ IDisposable not properly handled
|
|
716
|
+
public void ProcessFile(string path) {
|
|
717
|
+
var stream = File.OpenRead(path);
|
|
718
|
+
var data = stream.ReadByte();
|
|
719
|
+
// stream not closed!
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// ✅ Correct: Use using statement
|
|
723
|
+
public void ProcessFile(string path) {
|
|
724
|
+
using var stream = File.OpenRead(path);
|
|
725
|
+
var data = stream.ReadByte();
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
// ❌ Async method blocking call
|
|
729
|
+
public void BadAsync() {
|
|
730
|
+
var result = GetDataAsync().Result; // Deadlock risk!
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// ✅ Correct: Async all the way
|
|
734
|
+
public async Task GoodAsync() {
|
|
735
|
+
var result = await GetDataAsync();
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
// ❌ Null reference exception risk
|
|
739
|
+
public string GetName(User user) {
|
|
740
|
+
return user.Profile.Name; // NRE risk
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
// ✅ Correct: Null check
|
|
744
|
+
public string? GetName(User? user) {
|
|
745
|
+
return user?.Profile?.Name;
|
|
746
|
+
}
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
---
|
|
750
|
+
|
|
751
|
+
## Multi-Language Security Checklist
|
|
752
|
+
|
|
753
|
+
### 10-Point Security Review Checklist (Applicable to All Languages)
|
|
754
|
+
|
|
755
|
+
| # | Check Item | Description | Tools |
|
|
756
|
+
|---|------------|-------------|-------|
|
|
757
|
+
| 1 | **Input Validation** | Type, length, format, range validation | Static analysis |
|
|
758
|
+
| 2 | **Authentication & Authorization** | Session management, password storage, permission checks | Security scan |
|
|
759
|
+
| 3 | **Data Encryption** | TLS, encryption algorithms, key management | Config review |
|
|
760
|
+
| 4 | **Exception Handling** | Error message leakage, resource cleanup | Code review |
|
|
761
|
+
| 5 | **Dependency Management** | Known vulnerabilities, version compatibility | npm audit / pip-audit |
|
|
762
|
+
| 6 | **API Security** | Authentication, rate limiting, data validation | API testing |
|
|
763
|
+
| 7 | **CSRF Protection** | Token validation, SameSite Cookie | Framework config |
|
|
764
|
+
| 8 | **Code Execution** | Don't execute user input, template injection | Static analysis |
|
|
765
|
+
| 9 | **Business Logic** | Permission bypass, payment flow vulnerabilities | Manual review |
|
|
766
|
+
| 10 | **Code Quality** | Readability, documentation, test coverage | Linter |
|
|
767
|
+
|
|
768
|
+
### Quick Check Commands Summary for Each Language
|
|
769
|
+
|
|
770
|
+
```bash
|
|
771
|
+
# Python
|
|
772
|
+
pylint src/ && mypy src/ && bandit -r src/ && pip-audit
|
|
773
|
+
|
|
774
|
+
# TypeScript/JavaScript
|
|
775
|
+
npx eslint . && npx tsc --noEmit && npm audit
|
|
776
|
+
|
|
777
|
+
# Go
|
|
778
|
+
golangci-lint run && go test -race ./...
|
|
779
|
+
|
|
780
|
+
# Java
|
|
781
|
+
mvn spotbugs:check && mvn checkstyle:check && mvn dependency-check:check
|
|
782
|
+
|
|
783
|
+
# Rust
|
|
784
|
+
cargo clippy -- -D warnings && cargo audit && cargo +nightly miri test
|
|
785
|
+
|
|
786
|
+
# C#
|
|
787
|
+
dotnet build /warnaserror && dotnet list package --vulnerable
|
|
788
|
+
```
|
|
789
|
+
|
|
790
|
+
---
|
|
791
|
+
|
|
792
|
+
## Reference Resources
|
|
793
|
+
|
|
794
|
+
- [OWASP Code Review Guide](https://owasp.org/www-project-code-review-guide/)
|
|
795
|
+
- [Google Style Guides](https://google.github.io/styleguide/)
|
|
796
|
+
- [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)
|
|
797
|
+
- [PEP 8 - Python Style Guide](https://peps.python.org/pep-0008/)
|
|
798
|
+
- [Effective Rust](https://effective-rust.com/)
|
|
799
|
+
- [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments)
|
|
800
|
+
- [Microsoft C# Coding Conventions](https://docs.microsoft.com/en-us/dotnet/csharp/fundamentals/coding-style/coding-conventions)
|