我正在尝试为以下防止JSON漏洞的中间件编写测试:
/**
* JSON vulnerability protection - prepend the data with ")]},\n",
*/
function protectJSON(req, res, next) {
res.send = (...args) => _prependAndSend(res, args);
return next();
}
module.exports = {
protectJSON,
};
function _prependAndSend(res, args) {
let body = args[0];
const statusCode = args[1];
const contentType = res.getHeader('Content-Type');
// EDIT: added _send
const _send = res.send;
console.log('body', JSON.stringify(body));
if (contentType && contentType.indexOf('application/json') !== -1) {
_send.call(res, `)]}',\n${body}`);
} else {
_send.apply(res, args);
}
}
所以我在下面写了测试,但是当我运行它时,我有一个疯狂的循环(res.send被无休止地调用)。
describe('Test suite for middlewares.protectJSON', () => {
let nextMock;
let responseStub;
beforeEach(() => {
nextMock = sinon.stub();
responseStub = {
getHeader: sinon.stub(),
};
});
it('should not prefix content type other than json', () => {
protectJSON(null, responseStub, nextMock);
responseStub.send({ data: 'test' });
expect(responseStub.send).to.have.been.calledWith( data: 'test' });
});
});
当我进行测试时,我得到了
body {"data":"test-data"}
body {"data":"test-data"}
body {"data":"test-data"}
body {"data":"test-data"}
// more logging
body {"data":"test-data"}
我不知道为什么它的行为就像修复它一样。任何帮助表示赞赏。
答案 0 :(得分:0)
用
修复它function protectJSON(req, res, next) {
const _send = res.send;
res.send = (...args) => _prependAndSend(res, _send, args);
return next();
}
基本上我从_send
方法中删除了_prependAndSend
的声明,而是在protectJSON
方法中声明它,然后将其作为参数传递给prependAndSend
方法。
function _prependAndSend(res, _send, args) {
let body = args[0];
const statusCode = args[1];
const contentType = res.getHeader('Content-Type');
if (contentType && contentType.indexOf('application/json') !== -1) {
_send.call(res, `)]}',\n${body}`);
} else {
_send.apply(res, args);
}
}