Обмислям следната архитектура. Клиент, свързан към сървър чрез 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);
ако извиквам функция по име с динамични данни.