为什么我无法检测http正文是否作为Base64编码,尽管这样做?



我做了一个简单的添加来检测http正文是否是base64结尾的:


const connect = require('connect');
const base64RegExp = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/;
const isBase64 = (str) => base64RegExp.test(str)

const app = connect();

app.use(function(req,res,next){

var body = [];
req.on('data',(data) =>
{
console.log('Getting Body');
body.push(data)
});
req.on('end',() => {
body = body.toString();
res.setHeader("Content-Type",'text/plain');
res.writeHead(200);
if(isBase64(body)){
res.end("BOdy base64 encodedn");
} else {
res.end("BOdy not base64 encodedn");
}

});
});
app.listen(8090);

但是一旦我这样做了:

base64 ~/Εικόνες/IMG_20230124_114954.jpg | curl --request POST --data @-  http://127.0.0.1:8090

我:

BOdy not base64 encoded

表示应用程序无法识别base64编码字符串为base64 enbcoded字符串。知道为什么没能做到吗?

我试图使用这个答案中提到的方法

方法1

此外,我尝试使用:

if(isBase64(body.replace("n","").replace("r",""))){
res.end("BOdy base64 encodedn");
} else {
res.end("BOdy not base64 encodedn");
}

我仍然得到相同的结果。

方法2:

我也试着修复它:


const connect = require('connect');
// const base64RegExp = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/;
const isBase64 = (str) => Buffer.from(str.replace("n","").replace("r",""), 'base64').toString('base64') === str
const app = connect();

app.use(function(req,res,next){

var body = [];
req.on('data',(data) =>
{
console.log('Getting Body');
body.push(data)
});
req.on('end',() => {
body = body.toString();
res.setHeader("Content-Type",'text/plain');
res.writeHead(200);
if(isBase64(body.replace("n","").replace("r",""))){
res.end("BOdy base64 encodedn");
} else {
res.end("BOdy not base64 encodedn");
}

});
});
app.listen(8090);

发送base64编码的数据,结果相同

curl默认以url编码的形式发送数据。base64编码字符串中的+字符被解释为空格,导致正则表达式测试失败。您需要将Content-Type标头设置为application/octet-stream:

base64 ~/Εικόνες/IMG_20230124_114954.jpg | 
curl --request POST 
--data-binary @- 
--header "Content-Type: application/octet-stream" 
http://127.0.0.1:8090

服务器接收到的数据可能被分割成块,导致正则表达式测试失败。您需要在将数据块转换为字符串并根据regex进行测试之前将它们连接起来:

req.on('end', () => {
body = Buffer.concat(body).toString();
// 
});

此外,您可以通过去掉换行符、回车符和空格来使isBase64函数更加健壮:

const isBase64 = (str) => {
const cleanedStr = str.replace(/[nrs]+/g, '');
return base64RegExp.test(cleanedStr);
};

完整代码:

const connect = require('connect');
const base64RegExp = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/;
const isBase64 = (str) => {
const cleanedStr = str.replace(/[nrs]+/g, '');
return base64RegExp.test(cleanedStr);
};
const app = connect();
app.use(function (req, res, next) {
let body = [];
req.on('data', (data) => {
console.log('Getting Body');
body.push(data);
});
req.on('end', () => {
body = Buffer.concat(body).toString();
res.setHeader('Content-Type', 'text/plain');
res.writeHead(200);
if (isBase64(body)) {
console.log(body);
res.end('Body base64 encodedn');
} else {
res.end('Body not base64 encodedn');
}
});
});
app.listen(8090);