Хранение условий в строках

130
16 мая 2021, 03:00

Есть вот такой объект, из которого берет данные vue для отрисовки. Понадобилось хранить строковые представления кусочков кода (условий) в нем. Я знаю, все про риски, но так нужно. В какой-то момент эти условия надо проверить, как это сделать? Контекст для eval по умолчанию window, как ему подсунуть то, что лежит в obj.vars?

var obj = { 
  vars : { 
    a: 5, 
    b: 6, 
    c: false 
    }, 
  /*еще много всего*/ 
  blocks: [ 
      { 
        condition: "a<b", 
        text: "foo" 
      }, 
      { 
        condition: "!c && a>3", 
        text: "bar" 
      } 
    ] 
 }; 
  
 var app = new Vue({ 
    el: "#app", 
    data: { 
      blocks: obj.blocks, 
      vars: obj.vars 
    }, 
    methods: { 
      check: function(cond) { 
        if (cond=="") return true; /*своя логика тоже должна быть*/ 
        let result = true; 
        /*result = eval(cond) ?? */ 
        return result; 
      } 
    } 
 });
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> 
<div id="app"> 
<p v-for="block in blocks" v-if="check(block.condition)">{{block.text}}</p> 
</div>

Можно obj.vars записать в другом виде, если это поможет, например:

[{key:"a", value:5},{key:"b", value:6...]

Или в виде ассоциативного массива.

Answer 1

Отказ от ответственности. Вам не следует применять данный код на продакшене.

Это далеко не лучшее решение, есть все еще тысяча и один способ сломать этот код, он имеет давольно примитивную защиту (не может обращаться к глобальному scope или к DOM), но все еще можно устроить утечку памяти или получить доступ к URL или к хранилищам (IndexDB, LocalStorage, SessionStorage).

В самом крайнем случае, если код Вы получаете от доверенного источника и уверены в безопасности его исполнения, то Вы должны использовать HTTPS, что бы условия не могли быть подделаны атакой человек посередине

var obj = {
    vars : {
        a: 5,
        b: 6,
        c: false
    },
    /*еще много всего*/
    blocks: [
        {
            condition: "a<b",
            text: "foo"
        },
        {
            condition: "!c && a>3",
            text: "bar"
        }
    ]
};
function runTrustedCode (variables = {}, code) {
    for (let name of Object.keys(variables)) {
        let regexp = new RegExp(`${name}`, 'g');
        code = code.replace(regexp, `this.${name}`)
    }
    return Function(`"use strict";const window=null;const document=null; return(${ code })`).call(variables);
}
console.log(runTrustedCode(obj.vars, obj.blocks[1].condition))

READ ALSO
Не коректно выводится дата

Не коректно выводится дата

Мне нужно в ангуляр выводить дату которую я записал в БД как параметрЯ вывожу но в таком виде:

101
Почему после добавления новых инпутов, значения в старых пропадают

Почему после добавления новых инпутов, значения в старых пропадают

Подскажите, пожалуйста, почему после добавления новых инпутов, значения в старых пропадаютИ как это можно будет исправить? Заранее спасибо...

85
Locastorage javascript

Locastorage javascript

есть вот такой кодкогда включаю inspect а потом console выдает ошибку:

124