sjinks/node-modsecurity
GitHub: sjinks/node-modsecurity
为 Node.js 提供 ModSecurity WAF 能力的原生绑定库,让应用直接具备请求安全检测与威胁防护功能。
Stars: 5 | Forks: 1
# node-modsecurity
[](https://github.com/sjinks/node-modsecurity/actions/workflows/ci.yml)
[](https://sonarcloud.io/summary/new_code?id=sjinks_node-modsecurity)
[](https://github.com/sjinks/node-modsecurity/actions/workflows/dependency-review.yml)
一个用于 Node.js 的 [ModSecurity](https://github.com/SpiderLabs/ModSecurity#readme) 连接器
## 前置条件
由于此库提供了 `libmodsecurity` 的 Node.js 绑定,因此必须安装 `libmodsecurity` 及其开发文件。
请参阅:https://pkgs.org/search/?q=libmodsecurity
### Ubuntu
```
sudo apt-get install -y libmodsecurity3 libmodsecurity-dev
```
### CentOS
```
sudo yum -y install epel-release
sudo yum -y install libmodsecurity libmodsecurity-devel
```
### MacOS
待定
### Windows
[不支持](https://github.com/SpiderLabs/ModSecurity#windows)
### 注意事项
旧版本的 libmodsecurity 有时会有 Bug:例如,直到 3.0.8 的 libmodsecurity(至少从 3.0.6 开始)可能会[崩溃](https://github.com/SpiderLabs/ModSecurity/issues/2872)
如果您忘记调用 `Transaction::processConnection()` 或 `Transaction::processURI()`;libmodsecurity 3.0.6 存在内存泄漏。
因此,建议您自行安装(或者更有可能是构建)最新版本的 libmodsecurity。[官方文档](https://github.com/SpiderLabs/ModSecurity#compilation)
和[项目 Wiki](https://github.com/SpiderLabs/ModSecurity/wiki/Compilation-recipes-for-v3.x) 提供了有关如何编译该库的说明。
截至撰写本文时,libmodsecurity 3.0.9 似乎没问题:我的测试未发现内存泄漏,我也未能从 Node.js 使其崩溃。
## 安装
```
npm install modsecurity
```
## 用法
待定;请参阅[此处](https://github.com/sjinks/node-modsecurity/blob/245049f87b276fd56c1493b37afa437d04613e72/test/integration/lifecycle.mjs#L39-L85)获取用法示例。
tl;dr:
```
import { createServer } from 'node:http';
import { ModSecurity, Rules, Transaction } from 'modsecurity';
const modsec = new ModSecurity();
// Optional: set logging callback:
modsec.setLogCallback((message) => console.log(message));
const rules = new Rules();
rules.loadFromFile('rules.conf');
const server = createServer((request, response) => {
const tx = new Transaction(modsec, rules);
let res;
res = tx.processConnection(request.socket.remoteAddr, request.socket.remotePort, request.socket.localAddress, request.socket.localPort);
if (typeof res === 'object') {
return processIntervention(res, response, tx);
}
if (false === res) {
// modsecurity returned an error
}
res = tx.processURI(request.url, request.method, request.httpVersion);
if (typeof res === 'object') {
return processIntervention(res, response, tx);
}
let key = null;
for (const v of request.rawHeaders) {
if (key === null) {
key = v;
} else {
tx.addRequestHeader(key, v);
key = null;
}
}
res = tx.processRequestHeaders();
if (typeof res === 'object') {
return processIntervention(res, response, tx);
}
if (Buffer.isBuffer(request.body)) {
res = tx.appendRequestBody(request.body);
if (typeof res === 'object') {
return processIntervention(res, response, tx);
}
}
res = tx.processRequestBody();
if (typeof res === 'object') {
return processIntervention(res, response, tx);
}
// Handle request here
tx.processLogging();
});
function processIntervention(intervention, response, tx) {
response.statusCode = intervention.status;
if (intervention.url) {
response.setHeader('Location', intervention.url);
}
// intervention.log contains additional information
response.end();
tx.processLogging();
}
server.listen(3000);
```
标签:AppImage, C++插件, GNU通用公共许可证, libmodsecurity, MITM代理, ModSecurity, NAPI, Node.js, SQL注入防护, TCP/UDP协议, WAF, Web应用防火墙, XSS防护, 中间件, 安全组件, 攻击防御, 绑定库, 网络安全, 自定义脚本, 请求过滤, 隐私保护, 黑客防御