📜  eslint no-prototype-builtins (1)

📅  最后修改于: 2023-12-03 15:00:37.543000             🧑  作者: Mango

ESLint no-prototype-builtins

ESLint是一种在JavaScript代码中发现问题的工具,而'no-prototype-builtins'规则是其中的一种。该规则旨在防止使用JavaScript内置对象上的'prototype'属性的某些方法,例如'hasOwnProperty','isPrototypeOf'和'propertyIsEnumerable'等。

安装

要使用'no-prototype-builtins'规则,您需要安装ESLint。可以将其作为全局软件包安装,也可以将其作为项目依赖项安装。以下是通过npm将其作为项目依赖项安装的命令:

npm install eslint --save-dev
配置

要启用'no-prototype-builtins'规则,请使用以下配置:

{
  "rules": {
    "no-prototype-builtins": "error"
  }
}

此配置将使'no-prototype-builtins'规则以错误级别运行。如果要禁用规则,则可以将其设置为“禁用”:

{
  "rules": {
    "no-prototype-builtins": "off"
  }
}
为什么要使用'no-prototype-builtins'规则?

使用原型属性的某些方法可能会引起安全漏洞。例如,如果您的代码不正确地使用'hasOwnProperty'方法,则可能面临跨站点脚本(XSS)攻击。

const obj = { name: 'John' };
if (obj.hasOwnProperty('name')) {
  // do something
}

攻击者可以在用户的输入中包含'proto'字段,从而绕过'hasOwnProperty'检查:

const obj = { name: 'John' };
Object.setPrototypeOf(obj, { isAdmin: true }); // Set obj's prototype to an object with isAdmin property
if (obj.hasOwnProperty('__proto__')) { // True due to prototype injection
  // do something unsafe
}

因此,'no-prototype-builtins'规则被推荐用于检测这些问题并提高代码安全性。

如何使用'no-prototype-builtins'规则?

以下是一些示例代码,说明如何正确使用'no-prototype-builtins'规则。

// Bad:
const obj = { name: 'John' };
if (obj.hasOwnProperty('name')) {
  // do something
}

// Good:
const obj = { name: 'John' };
if (Object.prototype.hasOwnProperty.call(obj, 'name')) {
  // do something
}
// Bad:
const obj = { name: 'John' };
if (!obj.hasOwnProperty('isAdmin')) {
  // do something
}

// Good:
const obj = { name: 'John' };
if (Object.prototype.hasOwnProperty.call(obj, 'isAdmin')) {
  // do something
}
// Bad:
const obj = { name: 'John' };
if (obj.propertyIsEnumerable('name')) {
  // do something
}

// Good:
const obj = { name: 'John' };
if (Object.prototype.propertyIsEnumerable.call(obj, 'name')) {
  // do something
}
// Bad:
const obj = { name: 'John' };
if (Object.prototype.isPrototypeOf(obj)) {
  // do something
}

// Good:
const obj = { name: 'John' };
if (Object.prototype.isPrototypeOf.call(Object.prototype, obj)) {
  // do something
}
总结

'no-prototype-builtins'规则是一种用于提高代码安全性的ESLint规则。它旨在防止使用JavaScript内置对象上的'prototype'属性的某些方法,例如'hasOwnProperty','isPrototypeOf'和'propertyIsEnumerable'等,以保护您的应用程序免受安全漏洞的影响。要使用该规则,请参考本文提供的配置和示例。