首页 > 解决方案 > JS 最有效和安全地检查来自用户的价值,而不会得到未定义 - 使用迷你函数

问题描述

假设我想像这样检查用户的输入:

if (a.b.c.d[0]=="Something")

并且用户不会发送这个,因此我会得到一个未定义的错误。

功能在这里使编程更容易。

所以我做了这样的事情:

function value(str) {
    try {
      return eval(str);
    } catch(err) {
      return null;
    }
  }

  let a = {
    b: {
      c: {
        d2: ["Something"]
      }
    }
  }

  // Now I can easy check for the incoming value;

  if (value("a.b.c.d[0]"))
    console.log(value("a.b.c.d[0]"));
  else
    console.log("No");

  // this going to return "No" instead of crash the whole app

它返回良好的结果 - 返回要在 if 语句中直接比较的实际值。当未定义时它返回null

因为我正在控制要发送给这个评估的内容——我永远不会发送危险数据——比如alert('xss');

但是,我仍然担心eval这里会有危险——会吗?如您所见,我没有将它用于用户输入,而仅用于我手动发送的字符串。

所以我的问题 - 这是确定这样的用户输入的好习惯吗?

这个问题是关于 JS 的安全性和最佳实践。

标签: javascriptsecurity

解决方案


这绝对不是好的做法,完全没有必要。虽然可能没有任何大的安全漏洞,但它真的很容易变成一个。你可以在没有 eval 的情况下做同样的事情:

function value(obj, str) {
  const arr = str.split('.');
  for(let s of arr){
    if(obj[s] === undefined)
      return undefined; // Or throw error?
    obj = obj[s];
  }
  return obj;
}

const userThing = {a: {b: {c: {d: ["something"]}}}};
console.log(value(userThing , "a.b.c.d.0"));


推荐阅读