'use strict';
|
|
const escapeMap = {
|
'"': '"',
|
'<': '<',
|
'>': '>',
|
'\'': ''',
|
};
|
|
module.exports = function surl(val) {
|
|
// Just get the converted the protocalWhiteList in `Set` mode,
|
// Avoid conversions in `foreach`
|
const protocolWhiteListSet = this.app.config.security._protocolWhiteListSet;
|
|
if (typeof val !== 'string') return val;
|
|
// only test on absolute path
|
if (val[0] !== '/') {
|
const arr = val.split('://', 2);
|
const protocol = arr.length > 1 ? arr[0].toLowerCase() : '';
|
if (protocol === '' || !protocolWhiteListSet.has(protocol)) {
|
if (this.app.config.env === 'local') {
|
this.ctx.coreLogger.warn('[egg-security:surl] url: %j, protocol: %j, ' +
|
'protocol is empty or not in white list, convert to empty string', val, protocol);
|
}
|
return '';
|
}
|
}
|
|
return val.replace(/["'<>]/g, function(ch) {
|
return escapeMap[ch];
|
});
|
};
|