detect-secrets-js
Version:
A JavaScript implementation of Yelp's detect-secrets tool - no Python required
162 lines (117 loc) • 6.15 kB
Markdown
# detect-secrets-js
A JavaScript implementation of [Yelp's detect-secrets](https://github.com/Yelp/detect-secrets) with Gitleaks integration for comprehensive secret detection.
## Features
- **Dual Scanner Approach**: Combines Yelp's detect-secrets algorithms and Gitleaks scanning capabilities
- **Git Blame Information**: Associates detected secrets with the authors who added them
- **Remote Repository Scanning**: Scan remote Git repositories without cloning them manually
- **Git History Scanning**: Scan specific commits or commit ranges in your Git history
- **CSV, JSON, and TXT Export**: Flexible output options for integrating with other tools
- **Cross-Platform**: Works on Windows, macOS, and Linux
## Installation
```bash
npm install detect-secrets-js
```
This package will attempt to install Gitleaks automatically using your system's package manager:
- Windows: Using Chocolatey or Scoop
- macOS: Using Homebrew
- Linux: Using apt-get or yum
### Prerequisites
Depending on your system, you might need one of these package managers:
- Windows: [Chocolatey](https://chocolatey.org/install) or [Scoop](https://scoop.sh/)
- macOS: [Homebrew](https://brew.sh/)
- Linux: apt-get or yum (usually pre-installed)
If the automatic installation fails, you can install Gitleaks manually:
1. Visit [Gitleaks Releases](https://github.com/gitleaks/gitleaks/releases)
2. Download the appropriate version for your system
3. Add it to your system PATH
## Background
This project is based on [Yelp's detect-secrets](https://github.com/Yelp/detect-secrets), a tool designed to reliably detect secrets in a codebase. We've enhanced it by integrating with [Gitleaks](https://github.com/zricethezav/gitleaks), providing a more comprehensive scanning solution. While the original Yelp tool focuses on pattern matching, Gitleaks adds capabilities like entropy detection and Git history analysis.
## Usage
### Local Directory Scanning
```bash
# Scan current directory with both scanners
detect-secrets-js scan
# Scan a specific directory
detect-secrets-js scan /path/to/directory
# Use only detect-secrets scanner (Yelp's algorithm)
detect-secrets-js scan --scanner detect-secrets
# Use only Gitleaks scanner
detect-secrets-js scan --scanner gitleaks
```
### Remote Repository Scanning
```bash
# Scan a remote repository
detect-secrets-js scan https://github.com/user/repo --remote
# Scan a specific branch
detect-secrets-js scan https://github.com/user/repo --remote --branch main
# Scan a specific commit
detect-secrets-js scan https://github.com/user/repo --remote --commit a1b2c3d
# Scan a range of commits
detect-secrets-js scan https://github.com/user/repo --remote --from-commit a1b2c3d --to-commit e4f5g6h
```
### Git History Scanning
```bash
# Scan all commits in a local repository
detect-secrets-js scan /path/to/repo --all-commits
# Scan a specific commit
detect-secrets-js scan /path/to/repo --commit a1b2c3d
# Scan a range of commits
detect-secrets-js scan /path/to/repo --from-commit a1b2c3d --to-commit e4f5g6h
```
### Output Options
```bash
# Save results to JSON file (default)
detect-secrets-js scan --output results.json
# Save as CSV for spreadsheet analysis
detect-secrets-js scan --output results.csv
# Save as readable text file
detect-secrets-js scan --output results.txt
```
## Options
| Option | Description |
| ---------------------------- | ------------------------------------------------------------------------ |
| `--scanner <scanner>` | Scanner to use: `detect-secrets` (Yelp), `gitleaks`, or `both` (default) |
| `--output <path>` | Output file path (default: ./scan-results.json) |
| `--exclude-dirs <dirs...>` | Directories to exclude |
| `--exclude-files <files...>` | File patterns to exclude |
| `--max-file-size <size>` | Maximum file size in bytes (0 for no limit) |
| `--check-missed` | Check for potentially missed secrets |
| `--verbose` | Show additional information |
| `--remote` | Scan a remote repository |
| `--branch <branch>` | Branch to check out for remote scans |
| `--commit <hash>` | Scan a specific commit hash |
| `--all-commits` | Scan all git commit history |
| `--from-commit <hash>` | Starting commit hash for git history scan |
| `--to-commit <hash>` | Ending commit hash for git history scan |
| `--disable-git-blame` | Disable git blame information gathering |
| `--git-repo-path <path>` | Specify git repository path for external scans |
| `--include-node-modules` | Include node_modules in the scan (not recommended) |
## API
```javascript
const detectSecrets = require('detect-secrets-js');
const {
runGitleaksScan,
scanRemoteRepository,
scanGitHistory,
} = require('detect-secrets-js/gitleaks');
async function scanMyProject() {
// Initialize the scanner (required for detect-secrets)
await detectSecrets.initialize();
// Scan with both scanners (Yelp's detect-secrets and Gitleaks)
const results = await detectSecrets.scanWithBothScanners('./src', {
excludeDirs: ['node_modules', 'dist'],
checkMissed: true,
enrichWithGitInfo: true,
});
console.log(`Found ${results.secrets.length} secrets`);
// Scan remote repository
const remoteResults = await scanRemoteRepository(
'https://github.com/user/repo',
'main'
);
// Scan git history
const gitResults = await scanGitHistory('./repo', 'a1b2c3d', 'e4f5g6h');
}
```
## License
MIT