Michael_K: Sicherheit - Erstellen von Javascript Class

Hallo,

gibt es aus Sicherheitsaspekten gute Argumente, warum bei Javascript Klassen bestimmte Methoden bzw. Variablen nicht von aussen zugänglich sein sollten sondern als private Werte in die Klassen einzubinden sind? Ist das ein Thema? Ich konnte hier bei selfhtml.org nichts dazu finden.

Als Beispiel:

class Auto {
  constructor(){
    this.n1 = 2;
    this.n2 = 3;
  }

  calculate(){
     return this.n1 + this.n2;
  }

  result(){
     return this.calculate()
  }
}

Gibt es aus Sicherheitsaspekten Gründe, warum Methode calculate() und die Attribute n1, n2 für die Klasse Auto nicht von "aussen" erreichbar sein sollten.

Gruss Michael

  1. Lieber Michael_K,

    es kommt darauf an.

    Wie immer.

    Gibt es aus Sicherheitsaspekten Gründe, warum Methode calculate() und die Attribute n1, n2 für die Klasse Auto nicht von "aussen" erreichbar sein sollten.

    Wenn eine andere JavaScript-Komponente damit interagiert und gewisse Dinge damit nicht tun können soll (wie z.B. spicken oder unendlich viele Goldmünzen aufladen), dann benötigst Du private Eigenschaften. Willst Du verhindern, dass eine andere JavaScript-Komponente diverse Methoden (wie hier calculate()) auslösen kann, dann benötigst Du private Methoden.

    Liebe Grüße

    Felix Riesterer

    1. Hallo Felix,

      praktisch ist es aber so, dass dieser Schutz in den meisten Fällen wirkungslos ist und eher eine Information für den Programmierer ist: „dies ist nicht für Dich gedacht“. Wer die Vereinbarung einhalten will, tut es, wer nicht, kommt dran vorbei.

      Natürlich sind Zugriffsregeln für ein ordentlich strukturiertes Programm relevant, ich kann aber als Autor von Komponente A nicht verhindern, dass der Autor von B im Zweifelsfall meinen Code kopiert und die private-Flags entfernt oder Getter für private Elemente hinzufügt.

      Der Benutzer kann mit den Developer Tools ebenfalls jederzeit in die Objekte hineinschauen.

      Vermutlich ist das einer der Gründe, warum JavaScript lange Zeit keine Sprachelemente dafür anbot.

      Versteh mich nicht falsch, ich finde private-Marker gut. Man darf nur nicht glauben, damit Daten sicher versteckt zu haben. Dazu muss ich sie auf dem Server behalten.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Lieber Rolf,

        praktisch ist es aber so, dass dieser Schutz in den meisten Fällen wirkungslos ist und eher eine Information für den Programmierer ist: „dies ist nicht für Dich gedacht“. Wer die Vereinbarung einhalten will, tut es, wer nicht, kommt dran vorbei.

        man muss hier die Bedeutung von „Schutz“ genauer erklären. Private Eigenschaften und Methoden sind kein Schutz vor Datenausspäherei. Sie sind auch kein Schutz vor Malware-Attacken. Ebensowenig vor Staats- und sonstigen Trojanern (Software). Sie sind als Schutz davor gedacht, dass eine andere Programmkomponente Daten ungewollt manipulieren kann. Mehr auch nicht.

        Natürlich sind Zugriffsregeln für ein ordentlich strukturiertes Programm relevant, ich kann aber als Autor von Komponente A nicht verhindern, dass der Autor von B im Zweifelsfall meinen Code kopiert und die private-Flags entfernt oder Getter für private Elemente hinzufügt.

        s.o.

        Der Benutzer kann mit den Developer Tools ebenfalls jederzeit in die Objekte hineinschauen.

        s.o.

        Vermutlich ist das einer der Gründe, warum JavaScript lange Zeit keine Sprachelemente dafür anbot.

        Nein, das hat meiner Einschätzung nach eher damit zu tun, dass JavaScript an die Leistungsfähigkeit von Prozessoren gekoppelt war, die eine effiziente Sprache erst ermöglichten, als Google damit anfing, einen JIT-Compiler für JavaScript zu bauen. Bis dato war das eine Interpretersprache, deren Ausführung prinzipbedingt so langsam war, dass man kaum so elaborierte Dinge damit tun wollte, dass es den heutigen Sprachumfang überhaupt gebraucht hätte.

        Liebe Grüße

        Felix Riesterer

        1. Erst einmal vielen Dank für die Antworten, ich glaube, dass ich es nun ganz gut einordnen kann.

  2. Wenn die Eigenschaften nicht direkt von außen zugänglich sind verwendet man "Getter" (zum Auslesen) und "Setter" (zum Setzen).

    Diese Methoden können Voraussetzungen (Rechte, sonstige Bedingungen, Inhalte…) prüfen, Umrechnungen vornehmen, sonstwas.

    Das wird dann wichtig, wenn andere Programmierer andere Teile Deines Skriptes (Libarys) schreiben und Du diese womöglich nicht mal kennst...

    (Zudem lâuft JS nicht nur im Browser. Siehe node.js)