Skip to content
← Back to rules

eslint/no-prototype-builtins 面倒くさい

An auto-fix is available for this rule.

何をするか

オブジェクトに対して、一部の Object.prototype メソッドを直接呼び出すことを禁止する

なぜ問題なのか

ECMAScript 5.1 では Object.create が追加され、指定された [[Prototype]] を持つオブジェクトの作成が可能になった。
Object.create(null) は、マップとして使用されるオブジェクトを作成するためによく使われるパターンである。
この場合、オブジェクトが Object.prototype からのプロパティを持っていると仮定すると、エラーが発生する可能性がある。このルールは、オブジェクトから直接一部の Object.prototype メソッドを呼び出すことを防ぐ。
さらに、オブジェクトに Object.prototype にある組み込みプロパティをシャドーするプロパティが存在する場合があり、予期しない振る舞い、あるいはサービス拒否(DoS)攻撃のセキュリティ脆弱性を引き起こす可能性がある。
たとえば、ウェブサーバーがクライアントからの JSON 入力を解析し、その結果得られたオブジェクトに対して hasOwnProperty を直接呼び出すと、悪意あるクライアントが {"hasOwnProperty": 1} というような JSON 値を送信することで、サーバーがクラッシュする可能性がある。

このような微妙なバグを回避するためには、これらのメソッドを常に Object.prototype から呼び出すのが望ましい。たとえば、foo.hasOwnProperty("bar")Object.prototype.hasOwnProperty.call(foo, "bar") に置き換えるべきである。

このルールに違反する 不正な コードの例:

javascript
var hasBarProperty = foo.hasOwnProperty("bar");
var isPrototypeOfBar = foo.isPrototypeOf(bar);
var barIsEnumerable = foo.propertyIsEnumerable("bar");

使い方

設定ファイルまたは CLI 経由でこのルールを有効化するには、次のようにする:

json
{
  "rules": {
    "no-prototype-builtins": "error"
  }
}
bash
oxlint --deny no-prototype-builtins

参照