在 ExpressJS 中将对象传递给 javascript
pass object to javascript in ExpressJS
我在将包含双引号的 json 字符串转换回 JSON.parse()
中的 javascript 对象时遇到问题。下面是详细信息。
我有一个对象保存在nodejs的变量groupdata
中app.js
[{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New\" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
在我的 nodejs app.js 代码中,groupdata 对象作为 json 字符串传递给客户端。
function doRender() {
res.render('groupdata', {
'groupdata': JSON.stringify(groupdata)
});
}
我的客户端代码首先尝试通过函数 htmlDecode()
然后 JSON.parse()
一个有效的 json 字符串来阻止 XSS 攻击。
JSON.parse(test1)
只有字符串不包含双引号才会成功。
JSON.parse(test2)
将因以下错误而失败
function htmlDecode(input){ //prevent XSS attack;
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
console.log('groupdata: ' + "<%= groupdata %>");
var test1 = htmlDecode("<%= (groupdata) %>");
console.log('test1: ' + test1);
var test2 = htmlDecode("<%= JSON.stringify(groupdata) %>");
console.log('test2: ' + test2);
JSON.parse(test1); // Succeed if only test1 value contains no double quote
JSON.parse(test2); // ERROR: Uncaught SyntaxError: Unexpected token _
控制台登陆客户端chrome浏览器:
groupdata: [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
test1: [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
test2: "[{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New\" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]"
问题:在这种情况下,如何将带双引号的 json 字符串转换为 javascript 对象?
原来EJS有自己的htmlescape方式来防止XSS攻击
<script type="text/javascript">
var groupdata = <%- JSON.stringify(groupdata); %>
</script>
这简单明了。再次感谢@migg 的评论。
我在将包含双引号的 json 字符串转换回 JSON.parse()
中的 javascript 对象时遇到问题。下面是详细信息。
我有一个对象保存在nodejs的变量
groupdata
中app.js[{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New\" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
在我的 nodejs app.js 代码中,groupdata 对象作为 json 字符串传递给客户端。
function doRender() { res.render('groupdata', { 'groupdata': JSON.stringify(groupdata) }); }
我的客户端代码首先尝试通过函数
htmlDecode()
然后JSON.parse()
一个有效的 json 字符串来阻止 XSS 攻击。
JSON.parse(test1)
只有字符串不包含双引号才会成功。
JSON.parse(test2)
将因以下错误而失败
function htmlDecode(input){ //prevent XSS attack;
var e = document.createElement('div');
e.innerHTML = input;
return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}
console.log('groupdata: ' + "<%= groupdata %>");
var test1 = htmlDecode("<%= (groupdata) %>");
console.log('test1: ' + test1);
var test2 = htmlDecode("<%= JSON.stringify(groupdata) %>");
console.log('test2: ' + test2);
JSON.parse(test1); // Succeed if only test1 value contains no double quote
JSON.parse(test2); // ERROR: Uncaught SyntaxError: Unexpected token _
控制台登陆客户端chrome浏览器:
groupdata: [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
test1: [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
test2: "[{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New\" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]"
问题:在这种情况下,如何将带双引号的 json 字符串转换为 javascript 对象?
原来EJS有自己的htmlescape方式来防止XSS攻击
<script type="text/javascript">
var groupdata = <%- JSON.stringify(groupdata); %>
</script>
这简单明了。再次感谢@migg 的评论。