создание опций хайкартов в views.py - PullRequest
1 голос
/ 23 апреля 2019

ИЗБЕГАТЬ 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 как частьпараметры, например, установка цвета текста с использованием Highcharts.getOptions().colors[0],

'title': {
        'text': 'Rainfall',
        'style': {
            'color': Highcharts.getOptions().colors[0]
        }
    },

Если я не ставлю кавычки при создании параметров в views.py, это будет рассматриваться как код и результат Pythonоднако в случае ошибки, если я добавлю к ней кавычки, в javascript это будет рассматриваться как строка, которая не будет работать.

Возможно ли это?или я должен просто создать опции в javascript и просто получить часть данных в бэкэнде, а не все.

1 Ответ

1 голос
/ 23 апреля 2019

Вы можете вернуть код JS в Django в виде строки, а затем запустить на нем eval(), но выполнение подобного кода открывает возможность атаки XSS, особенно если информацияuser-submittable.

Лучше всего было бы создать стилевое оформление на стороне 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...