javascript - JS 最佳实践和安全检查用户的值,而不会出现未定义的情况 - 使用迷你函数

标签 javascript security

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

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 的安全性和最佳实践。

最佳答案

不必在这里使用eval。您所需要做的就是在访问其子属性之前确保路径中的所有属性都存在。

这可以使用这样的东西来完成:

Boolean(a && a.b && a.b.c && a.b.c.d && a.b.c.d[0] == "Something");

此处,短路 AND 运算符 (&&) 确保在 a.b 计算结果为 false 时不会访问 a.b.c。因此在这种情况下代码不会抛出错误。

function checkValue(a) {
  return Boolean(a && a.b && a.b.c && a.b.c.d && a.b.c.d[0] == "Something");
}


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

console.log(checkValue(a));

a = {
  b: {
    c: {
      d: ["Something"]
    }
  }
}
console.log(checkValue(a));

关于javascript - JS 最佳实践和安全检查用户的值,而不会出现未定义的情况 - 使用迷你函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51173365/

相关文章:

ios - 不允许向本地主机发出请求 - swift

c# - 如何在解密数据之前检查密码

c# - 将 C# 变量传递给 JS 的最佳方式

java - 如何解决sonatype-2017-0312漏洞

javascript - AngularJS:如何禁用表单中的所有表单控件?

php - 使用 PHP 回显 HTML 由于引号导致语法错误

java - 确保后端服务安全的正确方法 - oAuth

php - 在查询字符串中使用长哈希来识别动态文档的安全性

javascript - 如何使用 JavaScript 放大图像?

javascript - 单击时禁用 <li> 元素