避免EVAL
我的问题已得到解答,我最终使用了eval,但在搜索了eval的功能后,我最终没有使用它,而是使用了另一种方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Do_not_ever_use_eval!
在我的应用程序中,我在后端构建整个图表选项并将其作为json响应返回
def get_chart_data(request):
chart = {
'title': {
'text': ''
},
'xAxis': {
'categories': [],
'title': {
'text': ''
},
'type': 'category',
'crosshair': True
},
'yAxis': [{
'allowDecimals': False,
'min': 0,
'title': {
'text': ''
}
}, {
'allowDecimals': False,
'min': 0,
'title': {
'text': ''
},
'opposite': True
}],
'series': [{
'type': 'column',
'yAxis': 1,
'name': '',
'data': []
}, {
'type': 'line',
'name': '',
'data': []
}, {
'type': 'line',
'name': '',
'data': []
}]
}
return JsonResponse(chart)
然后使用ajax获取数据并使用数据响应
Highcharts.chart('dashboard1', data);
到目前为止我对此感到满意,但如果我想使用高图函数作为选项的一部分,我会遇到问题,例如使用Highcharts.getOptions().colors[0]
设置文本的颜色,
'title': {
'text': 'Rainfall',
'style': {
'color': Highcharts.getOptions().colors[0]
}
},
如果我在views.py
中构建选项时没有引用它,它将被视为python代码并导致错误,但是如果我添加引号,它将被视为javascript中的字符串,这将无效。
这可能吗?或者我应该只是在javascript中构建选项,只是在后端获取数据部分而不是整个事情。
您可以将Django中的JS代码作为字符串返回,然后您可以在其上运行eval()
,但执行这样的代码可能会导致XSS攻击,特别是如果信息是用户可提交的。
否则,最好的办法是尽可能在JS端创建样式,并操纵传入的数据。
document.querySelector('a').addEventListener('click', function (e) {
e.preventDefault();
var complexJson = {"parent": {"child": "alert('Here is a nested alert!')"}}
var alertString = "alert('Here is a simple alert!')";
eval(complexJson["parent"]["child"])
eval(alertString)
})
<a href="#">Click me!</a>