/ / Добра практика? Eval функцията от JSON, изпратена през WebSockets - json, node.js, websocket

Добра практика? Eval функцията от JSON е изпратена през WebSockets - json, node.js, websocket

Обмислям следната архитектура. Клиент, свързан към сървър чрез websockets, изпраща JSON пакет на сървъра. Вътре в JSON освен други данни има "действие": "somefunction ();". След това сървърът ще анализира JSON и ако действието не е празно, то ще оцени и ще изпълни тази команда.

Алтернативата на това би било просто да поставите низ "somefunction" в атрибута action и да имате switch оператор на сървъра, за да изпълните съответния код.

Мисли или други възможности?

Отговори:

0 за отговор № 1

Това, което описвате, не пречи на враждебен клиент да изпраща произволен код, който да бъде изпълнен. Това е дупка за сигурност.

Ако искате клиентският код да задейства някоифункциите на сървъра, след което предава някои данни, които вашият сървър ще анализира и проверява, за да се увери, че се изпълнява само съответният код. Това може да бъде JSON структура като тази, която клиентът изпраща:

{
"name": "foo",
"arguments": ["a", "b", "c"]
}

Когато сървъра го получи и анализира с него JSON.parse, тя проверява това name е валидна стойност и извиква съответната функция. Функциите могат да бъдат в такава структура

var dispatch = {
foo: function (a, b, c) { },
bar: function (a) { }
// etc...
}

И след като JSON данните се анализират и съхранят в променлива с име data (например), извикването може да бъде:

dispatch[data.name].apply(undefined, data.arguments)

Ако е необходимо, връщането на данни може да се върне на клиента като JSON структура.


-1 за отговор № 2

Склонен съм да го използвам window["function_name_as_string"](param1,param2); ако извиквам функция по име с динамични данни.