Wie viel Web-Security muss ein Frontend-Entwickler können?

Ozan27

Cadet 4th Year
Registriert
Juni 2016
Beiträge
127
Hallo an alle.. Ich lerne React und mein Ziel ist es frontend Projekte erstellen zu können.
Ich weiß nun nicht genau, wieviel Web Security wissen ich brauche.. Hab ein wenig gegoogled, und verschiedene Roadmaps gesehen. Aber es gibt sehr verschiedene Meinungen.. Was genau "muss" ich wissen, damit ich meine ersten Projekte fertig erstellen könnte. Was ist unerlässlich?
 
OWASP Top 10 lesen, verstehen und beachten. Dann hast du schon mal 99% der Fehler vermieden. 100% Schutz gegen Fehler gibt es eh nicht, schon allein weil du ja auf Libraries setzt die selbst Schwachstellen haben können und natürlich sollte man vor dem Go-Live einen Pentest machen lassen (wenn wir jetzt nicht gerade von einem Hobby-Projekt reden)
 
  • Gefällt mir
Reaktionen: Ozan27, BeBur, Tornhoof und 4 andere
Ein Projekt ist niemals "fertig". Man muss ständig auf die neuesten Bibliotheken updaten. Ein Projekt lebt.
Somit musst du auch einen Plan für die Software-Pflege erstellen.
Außerdem gibt es Testsysteme zum Testen der Security. Ich mache das bei meinen Projekten und zusätzlich wird auch eine externe Firma für Security-Tests beauftragt, die dafür hochspezialisiert sind.
 
  • Gefällt mir
Reaktionen: Ozan27, BeBur und Lee Monade
Als FE Entwicker sollte man wissen, was ins FE gehört und was nicht.

https://www.langenscheidt.com/jugendwort-des-jahres
Zumindest besser als die Entwickler von Langenscheidt.
Hier sieht man wie sie security Checks ins Frontend eingebaut haben. Man kann halt trotzdem für die verbotenen Wörter abstimmen.
Solche DInge gehören ins Backend und der Frontend Teil wäre nur dazu da um den user zu guiden. Hier hätte man es aus politischen Gründen weglassen müssen.

Javascript:
(function () {
    let wordCollect = true; // @todo NEEDS TO BE CHANGED MANUALLY :X
    let captchaOk = false;
    let wordCollectInput = document.getElementById('jw-word-collect');
    let inputEmpty = true;
    let noViolation = false;
    let wordSelected = false;
    let ageOk = false;
    let consentOk = false;
    let submitButton = document.getElementById('submitButton');
    const forbiddenSuggestions = ["stolzmonat", "hurensohn", "döp", "döpdödödöp", "döp döp döp", "döp dödö döp", "döp dö dö döp", "döp döö döö döp", "döpp", "neger", "nigger", "remigration", "deutschland den deutschen", "ausländer raus"];

    let form = document.getElementById('form');
    let debug = false;

    function checkCanSubmit() {
        if (debug) {
            submitButton.disabled = false;
            return true;
        }

        let canSubmit = noViolation && ageOk && captchaOk && (wordSelected || !inputEmpty) && consentOk;
        submitButton.disabled = !canSubmit;
        return canSubmit;
    }

    let ageSelect = document.getElementById('age');
    let checkAgeSelected = function () {
        let ageValue = parseInt(ageSelect.value);
        ageOk = ageValue > -1;
        checkCanSubmit();
    }
    ageSelect.addEventListener('change', checkAgeSelected);
    checkAgeSelected();

    let wordElements = document.querySelectorAll('div.word');
    for (let i = 0; i < wordElements.length; i++) {
        let el = wordElements[i];
        el.addEventListener('click', function () {
            this.querySelector('input').click();
        });
    }

    let consentElement = document.querySelector('div.consent');
    consentElement.addEventListener('click', function (e) {
        if ('checkbox' !== e.target.type && e.target.nodeName.toUpperCase() !== 'A') {
            this.querySelector('input').click();
        }
    });

    let inputElements = document.querySelectorAll('input[type=radio]');
    let checkWordSelected = function () {
        wordSelected = false;
        for (let i = 0; i < inputElements.length; i++) {
            wordSelected = wordSelected || inputElements[i].checked;
        }
        checkCanSubmit();
    };
    for (let i = 0; i < inputElements.length; i++) {
        inputElements[i].addEventListener('click', checkWordSelected);
    }
    checkWordSelected();

    let checkInputNotEmpty = function () {
        const input = wordCollectInput.value.trim().toLowerCase();
        inputEmpty = input.length === 0;

        noViolation = forbiddenSuggestions.reduce((acc, cur) => {
            return acc && !input.includes(cur);
        }, true);

        debugger;

        // noViolition = !forbiddenSuggestions.includes(input);

        checkCanSubmit();
    };

    if (wordCollect) {
        wordCollectInput.addEventListener('keyup', checkInputNotEmpty);
        checkInputNotEmpty();
    }

    let consentCheckboxElement = document.querySelector('div.consent input[type=checkbox]');
    let checkConsent = function () {
        consentOk = consentCheckboxElement.checked;
        checkCanSubmit();
    };
    consentCheckboxElement.addEventListener('change', checkConsent);
    checkConsent();

    window.onRecaptchaCallback = function () {
        captchaOk = true;
        checkCanSubmit();
    }

    window.onRecaptchaExpiredCallback = function () {
        captchaOk = false;
        checkCanSubmit();
    }

    let onFormSubmit = function (e) {
        if (debug) return true;
        let response = window.grecaptcha.getResponse();
        if (response.length === 0) {
            alert("Bitte zeige uns, dass du kein Roboter bist...");
            e.preventDefault();
            return false;
        }
        if (!checkCanSubmit()) {
            alert("Bitte überprüfe deine Eingaben...");
            e.preventDefault();
            return false;
        }
    }

    submitButton.addEventListener('click', function () {
        form.submit();
    });

    form.addEventListener('submit', onFormSubmit);

    checkCanSubmit();
})();

Auch der "Premium" Bereich von Chefkoch.de ist so ein Beispiel für sehr schlechtes engineering. Aber Kopf Hoch. Auch diese Entwickler bekommen ja anscheinend Geld für Ihre Arbeit ;-)
Problematisch wird es, wenn es dann um wirklich sicherheitsrelevante Anwendungen geht.
 
  • Gefällt mir
Reaktionen: Falc410
Formulare und Userbasierte DB Eingaben sowie Ausgaben prüfen und absichern ist wohl das bei der Entwicklung erstmal wichtigste. Serversicherheit kommt dazu wenn du alleinverantwortlich was aufsetzt.

Ahja: Das Frontend-JS Formularprüfen sollte der Usabillity gelten, also Hinweise an User ausspielen, wenn sie was falsch machen. Abschicken des Formulars verhindert das natürlich nicht (bzw lassen sich vorab ausgefüllte formulare an die "richtige" adresse schicken, wenn kein nonce verwendet wird)

Daher müssen alle Eingaben im Backend immer nachgeprüft werden.
 
  • Gefällt mir
Reaktionen: Ozan27
Das Backend darf nur Daten ans FE schicken, die der User sehen darf. Somit muss im Backend immer eine Prüfung auf den User stattfinden und nur dessen Daten laden.
Umgekehrt kann der User natürlich alles mögliche schicken, obwohl im FE möglichst viele Prüfungen statt finden sollten. Das Backend darf sich aber nicht auf das FE verlassen und muss alles nochmal prüfen, z. B. E-Mail-Eingabe wird im FE geprüft und im Backend nochmals. Somit muss natürlich immer ein gutes Fehlerhandling implementiert werden, z. B. das Backend wirft einen Fehler ans FE zurück, weil die E-Mail ungültig ist. Die Abstimmung bzgl. Validierung zwischen FE und BE ist auch oftmals schwierig.
Grundsätzlich ist das Fehlerhandling teilweise gefährlich. Ich habe schon oft gesehen, dass hier technische Daten an den User ausgegeben werden.
 
FE Validierung ist kein security feature, sondern ein usability thema. Besonders schön ist, wenn FE und BE Validierungen unterschiedlich sind... konnte auf einre ausländischen Seite mal meine Nummer nicht eingeben... FE Validierung ausgeschaltet... dann ging es, das Backend hat nicht gemeckert.
 
Ahja - hier gibt es noch weitere Möglichkeiten für verbesserte sicherheitsfunktionen, vor allem mit registrierten aber unvertrauenswürdigen usern: https://observatory.mozilla.org/

da kannst du server-header, content-securitiy policy und ähnlich erweiterte themen anschauen und bekommst punkte, wenn du sie auf deiner webseite löst. wie ein kleines spiel... durch die hinweise lernst du auch gleich wieder was.
 
Zurück
Oben