亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JavaScript 中的動態公式求值:eval() 或 not eval()

JavaScript 中的動態公式求值:eval() 或 not eval()

冉冉說 2023-09-28 16:41:40
我正在開發一個 Web 應用程序,管理員可以在其中定義和調整需要根據最終用戶提供的輸入值(數字)進行評估的公式。為了清楚起見,以下是我要排除的簡化示例:const obj = {    type: "External wall in contact with the ground",    layer: {        base: {            type: "Reinforced concrete (reinforcement 5 vol.%)",            thickness: 100,                         // <-- user value            lambda: 2.3,                            // <-- user value            _r: "{{thickness}}/{{lambda}}/1000",    // <-- admin defined            r: 0        },        waterproofing: {            type: "Bitumen sheets (single layer)",            share: 1,           // <-- user value            _r: "{{share}}",    // <-- admin defined            r: 0,        },        insulation: {            type: "XPS",            thickness: 100,                                 // <-- user value            share: 1,                                       // <-- user value            lambda: 0.040,                                  // <-- user value            _r: "{{thickness}}*{{share}}/{{lambda}}/1000",  // <-- admin defined            r: 0        }    }}Object.entries(obj.layer).forEach(([key, object]) => {    var formula = object._r    Object.keys(object).forEach(k =>        formula = formula.replace(`{{${k}}}`, object[k])    )    obj.layer[key].r = eval(formula)})console.log(obj)這_r是管理員定義的公式。這些{{value}}是最終用戶提供的值。該循環遍歷obj.layer屬性來評估公式并將答案保存在 中r。結果將是這個對象:{  type: 'External wall in contact with the ground',  layer: {    base: {      type: 'Reinforced concrete (reinforcement 5 vol.%)',      thickness: 100,      lambda: 2.3,      _r: '{{thickness}}/{{lambda}}/1000',      r: 0.043478260869565216    },    waterproofing: {      type: 'Bitumen sheets (single layer)',      share: 1,      _r: '{{share}}',      r: 1    },讓我們跳過我不驗證對象結構并確保所有值都可用的事實。我知道eval()這被認為是“危險的”。一個不太好的選擇是Function()。然而,并不完美。到目前為止,我看到了 3 種可能性:只有管理員可以更改公式。因此,執行惡意代碼的風險非常低。我需要的是驗證/清理這些值(類似isFloat()),僅此而已。使用該mathjs庫,它提供了一個很好的evaluate()功能:
查看完整描述

1 回答

?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

進一步閱讀該主題,mathjs似乎是最合理的解決方案:

第三方管理員可能是唯一可以編輯代碼的人,但它實際上將在哪里運行?在你的后臺?在訪客的計算機上?我強烈建議您避免使用 eval(),以免您因任何比特幣礦工訪問者最終從您的應用程序中簽約而受到指責??紤]到這一點,我認為你的第二個選擇是正確的。我認為根據一組預定義變量來評估公式是足夠安全的??雌饋?mathjs 積極避免 eval():?https://github.com/josdejong/mathjs/blob/master/docs/expressions/security.md


查看完整回答
反對 回復 2023-09-28
  • 1 回答
  • 0 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號