Как я могу обеспечить защиту и конфиденциальность? - PullRequest
0 голосов
/ 20 апреля 2019

Я хочу ограничить доступ к определенным вещам на языке JavaScript извне. Я провел некоторое исследование по этому вопросу, но я не смог получить ничего, что я хочу. Я знаю, что подчеркивание не обеспечивает полной защиты. Когда я пытаюсь достичь снаружи, я легко могу достичь. Я собираюсь написать пример кода.

  function Car(){
    this._mileage = 0;
  }

  Car.prototype.drive = function(miles){
    if(typeof miles == 'number' && miles > 0){
      this._mileage += miles;
    }else{
      throw new Error("Sadece pozitif sayılar girin");
    }
  };

  Car.prototype.readMileage = function(){
    return this._mileage;
  }
  
  var hondo = new Car();
    console.log('old: '+hondo._mileage);
  hondo._mileage = 100;
  console.log('new: '+hondo._mileage);

Как вы можете видеть: хотя я использовал подчеркивание, я мог легко получить доступ снаружи классной комнаты.

Другой метод

Я нашел метод в своем исследовании. Но я тоже не совсем понимаю.

  var Car = (function(){
    var _ = PrivateParts.createKey(); // createKey = ?

    function Car(mileage){
      _(this).mileage = mileage;
    }
    Car.prototype.drive = function(miles){
      if( typeof miles == 'number' && miles > 0){
        _(this).mileage += miles;
      }else{
        throw new Error('drive only accepts positive numbers');
      }
    }
    Car.prototype.readMileage = function(){
      return _(this).mileage;
    }
    return Car;
  }());

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

Ваш второй код, как правило, находится на правильном пути, хотя сначала вам нужно определить privateParts. Это также кажется слишком сложным в данный момент.

Идея состоит в том, чтобы сохранить переменную в закрытии; из-за обычных правил видимости переменная не может быть доступна вне того места, где она определена:

const fn = (() => {
  const foo = 'foo';
  return () => 'foo is: ' + foo;
})();

// at this point, the contents of the "foo" variable are not visible to the outside,
// you can only call the deliberately exposed function:
console.log(fn());

Аналогично, с классом вы можете сохранить все свойства, которые вы хотите сохранить приватными, в карте, проиндексированной используемым экземпляром: оставьте для карты значение только класс , а не внешний, и все вы положили на карту не будет виден снаружи:

const Car = (() => {
  const map = new WeakMap();
  return class Car {
    constructor(mileage) {
      map.set(this, { mileage });
    }
    drive(miles) {
      if (typeof miles == 'number' && miles > 0) {
        map.get(this).mileage += miles;
      } else {
        throw new Error('drive only accepts positive numbers');
      }
    }
    readMileage() {
      return map.get(this).mileage;
    }
  }
})();

var hondo = new Car(50);
console.log('old: '+hondo._mileage);
hondo._mileage = 100;
console.log('new: '+hondo._mileage);
console.log(hondo.readMileage());
hondo.drive(100);
console.log('newer: '+hondo._mileage);
console.log(hondo.readMileage());

Карта - это просто объект, проиндексированный каждым this (каждый экземпляр Car). Поскольку его значения могут быть получены только внутри замыкания Car, это эффективный способ убедиться, что информация не подвергается воздействию извне.

Тем не менее, это не мешает клиентам просматривать ваш исходный код - никакой клиентский код не является действительно закрытым. Если у вас есть конфиденциальная информация, вы должны отправлять ее клиенту только в том случае, если у него есть , чтобы ее узнать. Использование такой техники не помешает клиенту взглянуть на ваш код и, возможно, перехватить отправленную информацию. (Нечестивые сценарии могут делать что-то подобное, особенно если им предоставляется возможность запускаться до запуска сценария.) Так что это реализует не столько конфиденциально , сколько столько, сколько разумно но не герметичные ограничения на то, как другие скрипты с хорошим поведением могут получать доступ к данным.

1 голос
/ 20 апреля 2019

Он называется IIFE (выражение для немедленного вызова функции), и это означает, что закрытый ключ, который вы создаете с помощью PrivateParts.createKey, никогда не будет доступен вне функции, потому что код внутри IIFE запускается, а затем заканчивается.Благодаря тому, как вы его определили, теперь у вас есть совершенно уникальный ключ, к которому нельзя получить доступ откуда угодно.При этом все еще очень небезопасно выполнять любой ключ или шифрование на стороне клиента - используйте PHP, Node.JS или другой серверный язык для полной защиты ваших данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...