簡體   English   中英

Object.defineProperty-防止用戶更改此JavaScript

[英]Object.defineProperty - prevent user changing this JavaScript

我想在我的webapp中簽入用戶是否為admin。

  var obj = { admin: false; };

  Object.defineProperty(obj, "admin", {
      writable: false
  });

現在,用戶可以進入控制台並執行以下操作:

Object.defineProperty(obj, "admin", {
          writable: true
      });

obj.admin = true;

有辦法防止這種情況嗎? 如果符合特定條件,是否還有另一種最佳方法來阻止執行部分JavaScript代碼? 我了解,用戶仍然可以更改代碼,因此我有點在尋找良好的做法。

不能。您不能阻止用戶(例如我)在OWN瀏覽器上運行自己的JavaScript。 您需要在服務器端進行驗證,認證和授權。 要對請求進行身份驗證和授權,您需要使用標准機制,例如cookie,令牌,api訪問密鑰等。

您可以使用Object.defineProperty在無法更改的對象上創建屬性。 運行下面的代碼段,您將在控制台中看到TypeError: Cannot redefine property: admin

 const User = {}; Object.defineProperty( User, "admin", { value: false } ); Object.defineProperty( User, "admin", { value: true } ); 

這是因為Object.defineProperty對於可寫,可配置和可枚舉,默認設置為false。 這是MDN Object.defineProperty文檔中的例外,該文檔討論了重新定義現有屬性的問題。

當屬性已經存在時,Object.defineProperty()嘗試根據描述符中的值和對象的當前配置來修改屬性。 如果舊的描述符的可配置屬性設置為false,則該屬性被稱為“不可配置”,並且不能更改任何屬性(將可寫狀態更改為false的單向更改)。 如果屬性不可配置,則無法在數據和訪問器屬性類型之間切換。

話雖如此,將其用作安全措施會給您帶來麻煩。 就確保代碼安全而言...

  1. 始終驗證輸入您的應用程序的數據。
  2. 縮小並混淆您的代碼。
  3. 使用嚴格模式 這將防止許多不安全的做法。
  4. 您可以使用短絨棉絮來防止更多不安全的作法。
  5. 閱讀有關常見安全坑墜落的信息。 OWASP前十名是閱讀其中一些內容的好地方。

您可以使用Object.freeze

var obj = { admin: false };
Object.freeze(obj);
obj.admin = true;
console.log(obj)

//輸出{admin:false}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM