在views.py中构建高箱选项

问题描述 投票:1回答:1

避免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中构建选项,只是在后端获取数据部分而不是整个事情。

python django highcharts
1个回答
1
投票

您可以将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>
© www.soinside.com 2019 - 2024. All rights reserved.