我做了一个简单的添加来检测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);