выполнить код JavaScript внутри объекта JSON? - PullRequest
6 голосов
/ 31 января 2011

там нет?

что-то вроде:

{ key1 : "val1", key2: "val2", some_code: "document.getElementById("someid").innerHTML='test';" }

То есть код some_code будет выполнен без какого-либо вмешательства пользователя?

Ответы [ 4 ]

4 голосов
/ 31 января 2011

номер

Прежде всего, ваш пример не является допустимым JSON. Попробуйте в JSON validator .

Во-вторых, JSON - это стандарт обмена данными, и при правильном разборе любой текст, который внутри него, а именно некоторый код, не будет выполнен.

Читать дальше Проблемы безопасности JSON .

Правило большого пальца: не используйте функцию JavaScript eval, а используйте готовый синтаксический анализатор, такой как JSON Douglas Crockford .

3 голосов
/ 31 января 2011

Это больше не будет JSON. Но вы можете постобработать проанализированный JSON:

json.some_code = eval(json.some_code);

Однако это может быть опасно (внедрение скрипта и т. Д.).

Итак, если вы можете, сделайте это вместо:

json = { key1 : "val1", key2: "val2", elem: "someid", html:"test" };
document.getElementById(json.elem).innerHTML=json.html;
2 голосов
/ 31 января 2011

Это можно сделать, например, так:

{
  "functionName": function() {
    alert('Hello!');
  }()
}

Однако это больше не будет действительным JSON. JSON не принимает функции.

0 голосов
/ 31 января 2011

Ну, во-первых, вам нужно экранировать двойные кавычки:

{ key1 : "val1", key2: "val2", some_code: "document.getElementById(\"someid\").innerHTML='test';" }

(или использовать одиночные кавычки.)

Если вы хотите оценить поле some_code какскрипт, это так же просто, как передать его в eval:

eval(obj.some_code);

Это, конечно, очень опасно, если вы не имеете абсолютного контроля над содержимым some_code.

...