easy-waf integration now waits for specific length of the request instead of immediately processing it
This commit is contained in:
parent
7bd72effe7
commit
5c96cd69b2
1 changed files with 82 additions and 14 deletions
96
index.js
96
index.js
|
@ -48,6 +48,9 @@ if(nodemailer && easywafconfig.mailConfig && easywafconfig.mailConfig.serverConf
|
||||||
mailtransport = nodemailer.createTransport(easywafconfig.mailConfig.serverConfig);
|
mailtransport = nodemailer.createTransport(easywafconfig.mailConfig.serverConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var maxRequestCheckedSize = easywafconfig.maxRequestCheckedSize ? easywafconfig.maxRequestCheckedSize : 65536;
|
||||||
|
var maxRequestCheckedSizeStrict = easywafconfig.maxRequestCheckedSizeStrict ? easywafconfig.maxRequestCheckedSizeStrict : false;
|
||||||
|
|
||||||
easywafconfig.preBlockHook = function(req, moduleInfo, ip) {
|
easywafconfig.preBlockHook = function(req, moduleInfo, ip) {
|
||||||
var returnvalue = true;
|
var returnvalue = true;
|
||||||
if(easywafhooks.preBlockHook) {
|
if(easywafhooks.preBlockHook) {
|
||||||
|
@ -110,17 +113,7 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd,
|
||||||
logm[req.socket.remoteAddress] = serverconsole;
|
logm[req.socket.remoteAddress] = serverconsole;
|
||||||
if(!logm[req.socket.remoteAddress].locwarnmessage) logm[req.socket.remoteAddress].locwarnmessage = logm[req.socket.remoteAddress].errmessage;
|
if(!logm[req.socket.remoteAddress].locwarnmessage) logm[req.socket.remoteAddress].locwarnmessage = logm[req.socket.remoteAddress].errmessage;
|
||||||
|
|
||||||
//req.body
|
function easyWafCallback() {
|
||||||
function readableHandler() {
|
|
||||||
try {
|
|
||||||
if(req._readableState.buffer.head !== null) {
|
|
||||||
req.body = req._readableState.buffer.head.data.toString("latin1");
|
|
||||||
if (req.headers["content-type"] == "application/x-www-form-urlencoded") req.body = url.parse("?" + req.body.strip(), true).query;
|
|
||||||
if (req.headers["content-type"] == "application/json") req.body = JSON.parse(req.body.strip());
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
|
||||||
}
|
|
||||||
|
|
||||||
//EasyWaf
|
//EasyWaf
|
||||||
try {
|
try {
|
||||||
easyWaf(req, res, function() {
|
easyWaf(req, res, function() {
|
||||||
|
@ -162,10 +155,85 @@ Mod.prototype.callback = function callback(req, res, serverconsole, responseEnd,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(req._readableState.length > 0 || req._readableState.ended) {
|
|
||||||
readableHandler();
|
//req.body
|
||||||
|
function readableHandlerPredict() {
|
||||||
|
try {
|
||||||
|
if(req._readableState.buffer.head !== null) {
|
||||||
|
req.body = req._readableState.buffer.head.data.toString("latin1");
|
||||||
|
if (req.headers["content-type"] == "application/x-www-form-urlencoded") req.body = url.parse("?" + req.body.strip(), true).query;
|
||||||
|
if (req.headers["content-type"] == "application/json") req.body = JSON.parse(req.body.strip());
|
||||||
|
}
|
||||||
|
} catch (ex) {
|
||||||
|
}
|
||||||
|
easyWafCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
var chunkBuffer = [];
|
||||||
|
var chunkBufferLength = Math.min(parseInt(req.headers["content-length"]) - 1, maxRequestCheckSize);
|
||||||
|
var chunkBufferPointer = 0;
|
||||||
|
|
||||||
|
function readableHandlerWhole() {
|
||||||
|
var chunk = req.read(chunkBufferLength - chunkBufferPointer);
|
||||||
|
if(!chunk) chunk = req.read();
|
||||||
|
if(chunk) {
|
||||||
|
chunkBuffer.push(chunk);
|
||||||
|
chunkBufferPointer += chunk.length;
|
||||||
|
}
|
||||||
|
if(req._readableState.ended) {
|
||||||
|
req.removeListener("readable", readableHandlerWhole);
|
||||||
|
if (callServerError) {
|
||||||
|
callServerError(400, "easy-waf-integration/" + version);
|
||||||
|
} else {
|
||||||
|
res.writeHead(400, "Bad Request", {
|
||||||
|
"Server": "SVR.JS",
|
||||||
|
"Content-Type": "text/plain"
|
||||||
|
});
|
||||||
|
res.end("400 Bad Request!");
|
||||||
|
}
|
||||||
|
} else if(chunkBufferPointer >= chunkBufferLength) {
|
||||||
|
req.removeListener("readable", readableHandlerWhole);
|
||||||
|
try {
|
||||||
|
for(var i = chunkBuffer.length - 1; i >= 0; i--) {
|
||||||
|
req.unshift(chunkBuffer[i]);
|
||||||
|
}
|
||||||
|
} catch (ex) {
|
||||||
|
if (callServerError) {
|
||||||
|
callServerError(500, "easy-waf-integration/" + version, ex);
|
||||||
|
} else {
|
||||||
|
res.writeHead(500, "Internal Server Error", {
|
||||||
|
"Server": "SVR.JS",
|
||||||
|
"Content-Type": "text/plain"
|
||||||
|
});
|
||||||
|
res.end(ex.stack);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
req.body = "";
|
||||||
|
for(var i = 0; i < chunkBuffer.length; i++) {
|
||||||
|
req.body += chunkBuffer[i].toString("latin1");
|
||||||
|
}
|
||||||
|
easyWafCallback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!req._readableState.ended && !isNaN(chunkBufferLength) && chunkBufferLength > 0) {
|
||||||
|
if(maxRequestCheckedSizeStrict && parseInt(req.headers["content-length"]) > maxRequestCheckSize) {
|
||||||
|
if (callServerError) {
|
||||||
|
callServerError(413, "easy-waf-integration/" + version);
|
||||||
|
} else {
|
||||||
|
res.writeHead(413, "Content Too Large", {
|
||||||
|
"Server": "SVR.JS",
|
||||||
|
"Content-Type": "text/plain"
|
||||||
|
});
|
||||||
|
res.end("413 Content Too Large!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
req.once("readable", readableHandlerWhole);
|
||||||
|
} else if(req._readableState.length > 0 || req._readableState.ended) {
|
||||||
|
readableHandlerPredict();
|
||||||
} else {
|
} else {
|
||||||
req.once("readable", readableHandler);
|
req.once("readable", readableHandlerPredict);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue