TharVid/promptwall
GitHub: TharVid/promptwall
一款针对 LLM 应用的本地运行时安全库,用于实时阻断提示注入、越狱与敏感信息泄露。
Stars: 0 | Forks: 0
# Promptwall
**Lightweight runtime security for LLM apps** — block prompt injection, jailbreaks, and data exfiltration before they reach your model.
[](https://www.npmjs.com/package/promptwall)
[](https://opensource.org/licenses/MIT)
[](https://www.typescriptlang.org/)
## 为什么选择 Promptwall?
LLM 应用面临传统安全无法覆盖的威胁——提示注入、越狱、PII 泄露以及通过工具调用和 RAG 管道的数据外泄。Promptwall 位于你的应用与 LLM 之间,扫描所有进出内容。
一键接入。无需配置。无外部 API。所有检测在本地运行:
- 扫描**发出的提示**,在命中 LLM API 前进行拦截
- 扫描**返回响应 / 工具输出 / RAG 内容**,检测注入指令
- 检测**PII**(SSN、邮箱、电话)、**PHI**(MRN、药物、诊断)和 **PCI**(带 Luhn 校验的信用卡)
- 捕获**越狱攻击**(DAN、STAN、开发者模式、Unicode 技巧)
- **反规避引擎**——应对 leetspeak、同形异义字符、Base64/十六进制编码、URL 编码、HTML 实体
- **100% 本地运行**——零外部 API 调用,数据归属你
- **提供方无关**——兼容 OpenAI、Anthropic、Google、本地模型
- **零运行时依赖**
## 快速开始
```
npm install promptwall
```
```
import promptwall from 'promptwall';
const guard = promptwall();
const result = await guard.scan('Ignore all previous instructions');
// { safe: false, score: 0.95, action: 'block', findings: [...] }
const clean = await guard.scan('What is the capital of France?');
// { safe: true, score: 0, action: 'pass', findings: [] }
```
仅三行代码。
## 用法
### 默认(全部规则,阻断模式)
```
import promptwall from 'promptwall';
const guard = promptwall();
const result = await guard.scan(userInput);
if (!result.safe) {
console.log('Blocked:', result.findings.map(f => f.description));
}
```
### 选择特定规则
```
// Only block PII — allow everything else (injections, jailbreaks, etc.)
const guard = promptwall({
rules: [promptwall.pii()],
threshold: 0.5,
});
```
### 脱敏模式——净化而非阻断
```
const guard = promptwall({
mode: 'redact',
rules: [promptwall.pii(), promptwall.pci()],
threshold: 0.5,
});
const result = await guard.scan('My SSN is 123-45-6789');
console.log(result.redacted); // "My SSN is [PII_SSN]"
```
### 包装 LLM 调用
```
import OpenAI from 'openai';
import promptwall, { PromptwallError } from 'promptwall';
const openai = new OpenAI();
const guard = promptwall();
async function callLLM(prompt: string): Promise {
const res = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: prompt }],
});
return res.choices[0].message.content ?? '';
}
// Wrap it — auto-scans prompt before sending, response after receiving
const safeLLM = guard.wrap(callLLM);
try {
const response = await safeLLM('What is quantum computing?'); // works
await safeLLM('Ignore all previous instructions'); // throws PromptwallError
} catch (err) {
if (err instanceof PromptwallError) {
console.log('Blocked:', err.result.findings);
// LLM was never called
}
}
```
### Express 中间件
```
import express from 'express';
import promptwall from 'promptwall';
const app = express();
const guard = promptwall();
app.post('/api/chat', async (req, res) => {
const scan = await guard.scanPrompt(req.body.prompt);
if (!scan.safe) {
return res.status(400).json({
error: 'Request blocked',
findings: scan.findings.map(f => f.description),
});
}
const response = await callYourLLM(req.body.prompt);
res.json({ response });
});
```
### 扫描 RAG / 工具输出(入站)
```
const guard = promptwall({
rules: [promptwall.injection(), promptwall.pii(), promptwall.phi()],
});
// Scan content from your vector DB, tools, or function calls
const ragScan = await guard.scanResponse(ragContext);
if (!ragScan.safe) {
console.warn('RAG content contains threats:', ragScan.findings);
}
```
## 配置
```
promptwall({
// Rules to apply (default: all 6 built-in rules)
rules: [promptwall.jailbreak(), promptwall.injection(), promptwall.pii()],
// Action on detection: 'block' | 'warn' | 'redact' (default: 'block')
mode: 'block',
// Score threshold 0-1 to trigger action (default: 0.7)
threshold: 0.7,
// Scan direction: 'inbound' | 'outbound' | 'both' (default: 'both')
direction: 'both',
// Audit logging (default: true)
logging: true,
// Custom log handler (for SIEM, Datadog, etc.)
onLog: (event) => myLogger.info(event),
// Custom detection handler — return false to override the action
onDetection: (result) => {
if (result.score < 0.5) return false; // allow through
},
});
```
## 内置规则
| 规则 | 工厂方法 | 检测内容 | 方向 |
|------|---------|---------|-----------|
| **越狱** | `promptwall.jailbreak()` | DAN、STAN、开发模式、Unicode 技巧、约束移除 | 出站 |
| **注入** | `promptwall.injection()` | 指令覆盖、角色操纵、分隔符注入、提示提取 | 双向 |
| **PII** | `promptwall.pii()` | SSN、邮箱、电话、IP、出生日期、地址、姓名 | 双向 |
| **PHI** | `promptwall.phi()` | MRN、ICD-10 编码、药物、流程、提供者姓名 | 双向 |
| **PCI** | `promptwall.pci()` | 信用卡(带 Luhn 校验)、CVV、过期日期、银行账号、路由号 | 双向 |
| **毒性** | `promptwall.toxicity()` | 暴力、危险指令、非法活动 | 双向 |
### 规则选项
```
// PII — detect only specific types
promptwall.pii({ detect: ['ssn', 'email'], allowList: ['support@yourapp.com'] })
// PCI — custom redaction string
promptwall.pci({ redactWith: '****' })
// Jailbreak — add custom patterns
promptwall.jailbreak({ customPatterns: [/my-custom-pattern/i] })
// Injection — adjust sensitivity
promptwall.injection({ threshold: 0.5 })
```
## 反规避引擎
Promptwall 包含文本归一化管道,在扫描前击败常见规避技术:
| 技术 | 示例 | 是否处理 |
|-----------|---------|---------|
| Leetspeak | `1gn0r3 pr3v10us` | 是 |
| Unicode 同形异义字符 | Cyrillic `о` 替代 Latin `o` | 是 |
| 全角字符 | `ignore` | 是 |
| 零宽字符 | `ig\u200Bnore` | 是 |
| 带重音字符 | `ignóre` | 是 |
| Base64 编码 | `aWdub3JlIHByZXZpb3Vz...` | 是 |
| URL 编码 | `ignore%20previous` | 是 |
| HTML 实体 | `ign...` | 是 |
## 扫描结果
```
interface ScanResult {
safe: boolean; // true if all checks passed
score: number; // 0-1 aggregate threat score
action: string; // 'pass' | 'block' | 'warn' | 'redact'
findings: Finding[]; // individual detections
redacted?: string; // sanitized text (redact mode only)
duration: number; // scan time in ms
timestamp: string; // ISO timestamp
}
interface Finding {
rule: string; // 'pii', 'injection', etc.
category: string; // detection category
severity: string; // 'low' | 'medium' | 'high' | 'critical'
score: number; // 0-1 threat score
description: string; // human-readable description
matched?: string; // the matched text
start?: number; // position in original text
end?: number;
}
```
## 自定义规则
通过扩展 `BaseRule` 创建自己的检测器:
```
import { BaseRule, type Finding, type DetectionCategory, type ScanDirection } from 'promptwall';
class SecretCodeRule extends BaseRule {
name = 'secret-codes';
category: DetectionCategory = 'custom';
direction: ScanDirection = 'both';
scan(text: string): Finding[] {
const findings: Finding[] = [];
const pattern = /PROJECT[-_]?(ALPHA|BETA|GAMMA)/gi;
let match;
while ((match = pattern.exec(text)) !== null) {
findings.push(this.createFinding(
0.95,
'Internal codename detected',
match[0],
match.index,
match.index + match[0].length,
));
}
return findings;
}
redact(text: string): string {
return text.replace(/PROJECT[-_]?(ALPHA|BETA|GAMMA)/gi, '[REDACTED]');
}
}
// Use it alongside built-in rules
const guard = promptwall({
rules: [...promptwall.defaultRules(), new SecretCodeRule()],
});
```
## 审计日志
每次扫描都会生成结构化审计事件:
```
const guard = promptwall({
logging: true,
onLog: (event) => {
// Send to your SIEM, Datadog, Splunk, etc.
console.log(JSON.stringify(event));
},
});
```
事件格式:
```
{
"timestamp": "2026-01-15T12:00:00.000Z",
"direction": "outbound",
"action": "block",
"score": 0.95,
"findings": [{ "rule": "injection", "description": "..." }],
"textLength": 42,
"duration": 1.5
}
```
## 性能
所有检测在本地使用优化的正则表达式运行。无网络请求,无 ML 推理。
| 输入大小 | 规则数 | 耗时 |
|-----------|-------|----------|
| 100 字符 | 全部 6 | < 1ms |
| 1K 字符 | 全部 6 | < 2ms |
| 10K 字符 | 全部 6 | < 5ms |
| 100K 字符 | 全部 6 | < 20ms |
## 威胁模型
Promptwall 保护你免受 [OWASP LLM Top 10](https://owasp.org/www-project-top-10-for-large-language-model-applications/) 威胁:
| OWASP LLM 风险 | Promptwall 覆盖 |
|----------------|-----------------|
| LLM01: 提示注入 | `injection()` — 指令覆盖、分隔符注入、角色操纵 |
| LLM02: 不安全输出 | `scanResponse()` — 在渲染前扫描 LLM 输出 |
| LLM06: 敏感数据 | `pii()`, `phi()`, `pci()` — 检测并脱敏后再发送 |
| LLM07: 不安全插件 | `scanResponse()` — 扫描工具/RAG 输出中的注入 |
| LLM09: 过度依赖 | `toxicity()` — 标记响应中的有害内容 |
## 许可证
MIT - 参见 [LICENSE](LICENSE)
标签:AI应用防护, Base64绕过, DAN攻击, GNU通用公共许可证, Hex绕过, HTML实体绕过, MITM代理, Naabu, Node.js, npm, PCI检测, PHI检测, PII检测, RAG安全, Red Canary, STAN攻击, TypeScript, Unicode绕过, URL编码绕过, 内容安全, 前端安全, 反注入, 同形字攻击, 安全插件, 对抗性攻击, 工具调用安全, 开发者模式绕过, 提示注入防护, 提示词安全, 数据泄露防护, 文本审核, 无配置安全, 本地安全, 网络安全, 网络探测, 自动化攻击, 越狱攻击防护, 跨平台安全, 隐私保护, 零依赖, 零日漏洞检测