簡體   English   中英

如何避免在用戶定義的函數中使用JavaScript eval()

[英]How to avoid using JavaScript eval() in user-defined function

我正在嘗試制作一個通用的桌面RPG助手Web應用程序。 它必須是通用的,因為“海岸奇才”非常保護其版權。 因此,為了避免停下來,該系統必須能夠加載任意規則。 就是說,我和我的好友(以及大多數其他用戶)將使用它進行D&D。

在D&D中,修飾符基於角色的屬性。 要獲取修飾符,您需要獲取統計信息,然后減去10,除以2,然后四舍五入。

function getModifier(statValue) {
    return Math.floor((statValue - 10) / 2);
}

我的應用程序將能夠從.json文件加載游戲規則。 我希望能夠使此修飾符功能可由用戶定義。 最簡單的方法是僅對.json文件中提供的內容進行eval() ,但是由於安全問題,顯然這是一個糟糕的主意。

不幸的是,我想不出一種簡單的方法來以安全的方式解決這個問題。 顯然,我可以編寫自己的解析器,但這要比我目前想要的更加復雜。

有想法嗎?

首先,請記住,這一切都在客戶端。 只要您信任JSON(它來自服務器或與應用程序本身一起受控制),就可以使用它。 這並不能完全排除某些木馬程序插入惡意規則,但是我認為僵屍網絡還沒有學會玩D&D。

為了從字面上避免評估並提供某種程度的安全性,可以使用new Function 它采用參數名稱列表,然后是函數主體,使您可以大量控制函數的定義方式以及可以從何處引用函數。 您只需要將主體存儲在JSON文件中,就可以在很大程度上控制參數並使其難以分配給全局范圍,從而極大地減少了攻擊面。

如果您希望以此為 ,現在您的規則基本上是數學的,則可以考慮使用諸如pegjs之類的工具來為規則生成解析器。 計算器是解析器和編譯器的經典介紹之一,因此這可能是一個使用一些有趣的技術的機會。 由pegjs構建的規則和解析器在JS項目中非常易於使用(我有一個通過Babel使用PegJS和ES6的示例 )。

我做了一個快速的谷歌搜索,發現了兩個選擇-http : //mathjs.orghttp://jsep.from.so

順便說一句 編寫自己的解析器並不困難。 您也許可以用不到100行的代碼編寫一個足以滿足您的目的的代碼

解決您的問題的一種方法是使用沙盒iframe所有主要瀏覽器均支持該功能)

您可以在權限有限的單獨頁面上運行用戶代碼,以使代碼不會干擾應用程序的其余部分。 您可以使用postMessage()window.onmessage與沙盒頁面進行通信。

我看到有兩個選擇。 第一,如果您100%想在.json中定義函數,則需要進行解析。 JSON不允許使用函數,因此您需要將函數存儲為字符串並進行評估。

更好的方法是還提供config.js功能。 也許.json將有一個"configUrl":屬性,然后暴露眾所周知的API,如RPGHelper.setModifer(someFunction)您可以從config.js文件內調用。 然后,用戶可以自由定義那里的任意邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM