承認されたソリューションでは、myVar にエスケープされていない二重引用符を持つ値を持つプロパティがある場合、JSON.parse は失敗します。そのため、traverseObj をより適切に処理し、各文字列プロパティをエスケープします。
私のケースをカバーする関数は次のとおりです。
function traverseObj (obj, callback)
{
var result = {};
if ( !isArray(obj) && !isObject(obj) ) {
return callback(obj);
}
for ( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
var value = obj[key];
if (isMongoId(value)){
var newValue = callback(value.toString());
result[key] = newValue;
}
else if (isArray ( value) ) {
var newArr = [];
for ( var i=0; i < value.length; i++ ) {
var arrVal = traverseObj(value[i], callback);
newArr.push(arrVal);
}
result[key] = newArr;
}
else if ( isObject(value) ) {
result[key] = traverseObj(value, callback);
}
else {
var newValue = callback(value);
result[key] = newValue;
}
}
}
return result;
};
ejs よりも、次のことを行う必要があります。
<%
var encodeValue = function(val) {
if ( typeof val === 'string' ) {
return sanitizeXSS(val); //use some library (example npm install xss)
}
return val;
}
var encodedProduct = ejs_utils.traverseObj(product, encodeValue);
%>
これで、エスケープされていない構文で安全に転送できます
window.product = <%-JSON.stringify(encodedProduct)%>;