Существует несколько подходов к этой проблеме.
Опасно небезопасный eval
путь:
Этот подход напрямую вызывает eval
, он выполняет любой переданный код JavaScript и, следовательно, имеетмножество проблем с безопасностью, связанных с этим.
const newArray = stringArray.map(eval);
eval
с белым списком
Один из способов сделать вызов на eval
более безопасным - это использовать белый списокразрешенные шаблоны, это гарантирует, что код не получит доступ к каким-либо переменным за пределами предполагаемой области видимости.
const L = {};
L.latLng = (lat, lng) => ({ lat, lng })
const stringArray = [
"L.latLng(30.709455,76.688576)",
"L.latLng(30.709461,76.68856)",
"L.latLng(30.709461,76.68856)",
"L.latLng(30.70947,76.6886)",
"L.latLng(30.709461,76.68856)"
];
const newArray = stringArray.map((line) => {
if(/L\.latLng\(-?[0-9]+(?:\.[0-9]+),-?[0-9]+(?:\.[0-9]+)\)/.test(line)) {
return eval(line);
}
throw new Error('Invalid string specified: ' + line);
});
console.log(newArray);
Настраиваемый анализатор на строку
Имея настраиваемый анализатор на строку, вы предотвращаете выполнение любого нежелательного кода, поскольку могут выполняться только методы сохранения.
Это шаг вперед от exec с регистром белого списка, так как нужно захватить только определенные части строки
const L = {};
L.latLng = (lat, lng) => ({ lat, lng })
const stringArray = [
"L.latLng(30.709455,76.688576)",
"L.latLng(30.709461,76.68856)",
"L.latLng(30.709461,76.68856)",
"L.latLng(30.70947,76.6886)",
"L.latLng(30.709461,76.68856)"
];
const newArray = stringArray.map((line) => {
const match = /^L\.latLng\((-?[0-9]+(?:\.[0-9]+)),(-?[0-9]+(?:\.[0-9]+))\)$/.exec(line)
if(match !== null) {
return L.latLng(parseFloat(match[1]), parseFloat(match[2]));
}
throw new Error('Invalid string specified: ' + line);
});
console.log(newArray);