UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【ESlint】hasOwnPropertyの使い方でエラーがでた

ESlintを導入したらhasOwnPropertyを使っている箇所でエラーがでた

hasOwnPropertyはObject.prototypesにビルトインされている関数で、オブジェクトに引数で指定したキーがあるかを判別する関数

エラーがでた使い方は以下

var hasBarProperty = foo.hasOwnProperty("bar");

eslint.org

Disallow use of Object.prototypes builtins directly (no-prototype-builtins)

というメッセージでObject.prototypesビルトインの直接使用を禁止するというもの

なぜ禁止かというと

例えば、悪意のあるクライアントが{"hasOwnProperty": 1}のようなJSON値を送信した場合、オブジェクトに含まれるhasOwnPropertyが、Object.prototypeビルトインをシャドーイングしてしまい、意図しない動作やサービス拒否のセキュリティの脆弱性を引き起こす可能性がある

このようなバグを回避するため、常にこれらのメソッドをObject.prototypeから呼び出すことを推奨している

コードの正誤例

上で貼ったESlintドキュメントに記載されていた例

誤ったコードの例

/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = foo.hasOwnProperty("bar");
var isPrototypeOfBar = foo.isPrototypeOf(bar);
var barIsEnumerable = foo.propertyIsEnumerable("bar");

正しいコードの例:

/*eslint no-prototype-builtins: "error"*/
var hasBarProperty = Object.prototype.hasOwnProperty.call(foo, "bar");
var isPrototypeOfBar = Object.prototype.isPrototypeOf.call(foo, bar);
var barIsEnumerable = {}.propertyIsEnumerable.call(foo, "bar");