簡體   English   中英

保護用戶定義的javascript函數以保護node.js服務器

[英]Securing user defined javascript function to protect node.js server

我正在制作一個數學教學網頁(NodeJS后端和Angular前端)。 我想要一種特殊的用戶(創建者)來創建數學練習。 其中一個練習可能如下所示:

Marie has ${nums[0]} oranges and ${nums[1]} apples. How many fruits does she have?

現在我希望創建者編寫一個數字生成函數,如下所示:

const generate = () => {
  const nums = new Array(2).fill(0).map(e => Math.floor(Math.random() * 10)
  return { nums: nums, answer: nums.reduce((p, c) => p + c, 0) }
}

該功能應發送到服務器並存儲。 當用戶想要嘗試測試時,應該在服務器上執行該問題。 我該怎么做才能保護服務器免受惡意代碼的攻擊:

const generate = () => {
  process.exit()
}

真的很簡短的答案,這對服務器來說永遠不會真正安全。 無法證明程序是安全的。 沙盒等緩解措施有所幫助,但最終總是存在風險。 對於這個應用程序,可能是不必要的。

考慮一些溝通不需要exec的公式的方法。 一種方法可能是發送某種抽象語法樹,或者解析數學表達式。

這個npm包似乎很有希望。 填寫數學表達式字符串模板的方式與填寫書面問題模板的方式相同。 可能需要提供另一個對象來定義所需的隨機數,並將它們映射到名稱以便在模板中使用。 math-expression-evaluator

這對服務器/客戶端來說是不安全的。

不確定這是否正確。 但您可以限制全局變量訪問

 const generate1 = () => { process.exit(); } const generate2 = () => { const nums = new Array(2).fill(0).map(e => Math.floor(Math.random() * 10)); return { nums: nums, answer: nums.reduce((p, c) => p + c, 0) } } const funcStr1 = generate1.toString(); const funcStr2 = generate2.toString(); //get all global variables key from 'global' and check it exist or not // const globals = Object.keys(global); // will return same result as below remove keys which you want to allow const globals = ['DTRACE_NET_SERVER_CONNECTION', 'DTRACE_NET_STREAM_END', 'DTRACE_HTTP_SERVER_REQUEST', 'DTRACE_HTTP_SERVER_RESPONSE', 'DTRACE_HTTP_CLIENT_REQUEST', 'DTRACE_HTTP_CLIENT_RESPONSE', 'COUNTER_NET_SERVER_CONNECTION', 'COUNTER_NET_SERVER_CONNECTION_CLOSE', 'COUNTER_HTTP_SERVER_REQUEST', 'COUNTER_HTTP_SERVER_RESPONSE', 'COUNTER_HTTP_CLIENT_REQUEST', 'COUNTER_HTTP_CLIENT_RESPONSE', 'global', 'process', 'Buffer', 'clearImmediate', 'setImmediate', // 'clearInterval', // 'clearTimeout', // 'setInterval', // 'setTimeout' ]; const hasGlobal1 = globals.some((g) => funcStr1.includes(`${g}.`)); const hasGlobal2 = globals.some((g) => funcStr2.includes(`${g}.`)); console.log('generate1 has global', hasGlobal1); console.log('generate2 has global', hasGlobal2); 

暫無
暫無

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

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