👩🎓
Att kunna
WEBBLÄSARE
DATABAS
FRONT-END
BACK-END
HTTP Server
APP
FILER
V.S
FRONT-END STACK
BACK-END STACK
WEBBSERVER
FILER
FILER
WEBB-LÄSARE
DATABAS
HÄMTA DATA
SKAPA
WEBBPLATS
TEMPLATE
WEBB-LÄSARE
STATISKA V.S DYNAMISKA WEBBPLATSER
👉 Webbapplikation = Dynamisk sida + Funktionalitet
RENDERING PÅ SERVERSIDAN
Svenska
Engelska
Att kunna
HUR EN WEBBSIDA EFTERFRÅGAS
👉 Klient-server modellen (enkla versionen)
KLIENT
SERVER
👩💻
FÖRFRÅGAN (REQUEST)
SVAR (RESPONSE)
KLIENT
SERVER
👩💻
FÖRFRÅGAN (REQUEST)
SVAR (RESPONSE)
HUR EN WEBBSIDA EFTERFRÅGAS
KLIENT
SERVER
👩💻
KLIENT
KLIENT
HTTP REQUEST
HTTP RESPONSE
https://www.google.com/maps
Protokoll
(http eller https)
Domännamn
Resurs
DNS
DNS uppslag
https://216.58.211.206:443
TCP/IP socket anslutning
HTTP metod + dataförfrågan + HTTP version
HTTP request header (olika inställningar)
HTTP response body (endast om man skickar data med POST)
HTTP metod + dataförfrågan + HTTP version
HTTP response header
HTTP response body
3
1
2
4
Svenska
Engelska
Att kunna
API
ETT API, FLERA KONSUMENTER
WEBB-LÄSARE
MOBIL-APP
MOBIL-APP
APP
APP
FILER
DATABAS
HÄMTA DATA
SKAPA
WEBBPLATS
TEMPLATE
WEBB-LÄSARE
DYNAMISKA V.S API-DRIVNA WEBBPLATSER
DATABAS
HÄMTA DATA
WEBB-LÄSARE
TEMPLATE
SKAPA
WEBBPLATS
SKAPA ETT API
KONSUMERA ETT API
RENDERING PÅ SERVERSIDAN
RENDERING PÅ KLIENTSIDAN
Svenska
Engelska
Att kunna
REpresentational State Transfer
*beständighet. Möjlighet att spara data även och datorn/programmet stängs av. Databaser är en teknik att uppnå detta.
URI | Metod | Beskrivning |
---|---|---|
/posts | GET | Hämtar alla inlägg |
/posts | POST | Lägger till nytt inlägg |
/posts/{id} | GET | Hämtar specifikt inlägg |
/posts/{id} | PUT | Ersätter ett inlägg med annat |
/posts/{id} | DELETE | Tar bort specifikt inlägg |
Utgår från en s.k endpoint (ex https://api.instagram.com/v1 )
Users
Posts
Images
Comments
Likes
e.t.c...
Olika resurser på en blog
Posts
http://www.exampeblog.com/addNewPost
ENDPOINT
URL
/getPost
/updatePost
/deletePost
/getPostByUser
/deletePostByUser
INTE BRA 👎
👉 Endpoints ska endast innehålla resursnamn som posts, users, comments etc och använda HTTP-metoder för beteende
/getPost
/updatePost
/deletePost
/addNewPost
GET /posts/7
PUT /posts/7
DELETE /posts/7
POST /posts
id för ett inlägg
/getPostByUser
/deletePostByUser
GET /users/7/posts
DELETE /users/7/posts/9
CREATE
READ
UPDATE
DELETE
HTTP-metoder
Använda CRUD
Svenska
Engelska
Att kunna
*beständighet. Möjlighet att spara data även och datorn/programmet stängs av. Databaser är en teknik att uppnå detta.
Databas
NoSQL
DATABAS innehåller en eller flera "collections" såsom users, posts, etc.
SQL
"Tabell"
"Rader"
COLLECTION
innehåller ett flertal "document"
DOCUMENT
innehåller "key-value pairs"
SQL
"Tabell"
"Rader"
En relationsdatabas är en databas där information ("data") är organiserad i relationer (även kallade tabeller) bestående av raderoch kolumner (fält). En unik nyckel identifierar varje rad.
Hur olika tabeller relaterar till varandra
När PHP och MySQL används ihop
En tabell från en databas i MySQL
Svenska
Engelska
Att kunna
Största uppdateringen
Första release
NODE.JS ÄR EN RUNTIME MILJÖ FÖR JAVASCRIPT SOM BYGGER PÅ GOOGLES OPEN-SOURCE V8 JAVASCRIPT MOTOR
ANVÄNDNING
FÖRDELAR
MINDRE BRA
NPM
Node.js ”pakethanteringsystem”
VI KOMMER ATT ANVÄNDA FLERA PAKET FRÅN NPM SÅSOM RAMVERKET EXPRESS m.fl
console.log("Statement 1"):
console.log("Statement 2"):
console.log("Statement 3"):
Kod läses rad för rad, uppifrån och ner. När en funktion är klar, kör nästa.
En del rutiner tar tid. Exempel HTTP-requests eller hämta från databas. Hur hantera detta?
sånt som blockar!
Javascript/Node.js är
Statement 1
Statement 2
Statement 3
Statement 4
HTTP REQUEST
🕰
HÄMTA FRÅN DB
🕰
BLOCKERANDE 👎
Vår räddning...
Statement 1
Statement 2
Statement 3
CALLBACK
HTTP REQUEST
🕰
ICKE-BLOCKERANDE 👍
HTTP REQUEST
Starta exekveringen nu, men avsluta senare
"BAKGRUNDEN"
Single-thread
Här ska vår kod köras.
Bara en tråd.
👨💻
👩🎤
🕵️♀️
🧙♂️
Läsa stor fil
Login
Streama
Requesta ngt
"Bakgrunden"
Här ska tidskrävande proccesser köras!
Obs! Förenklad version 🙀
när klar
När saker måste ske i viss ordning
Typ det vi vill göra 👩💻
Leder till snårig kod. Kallas Callback Hell.
Don't go there😈
Till vår räddning 🤩
Kan ff användas i mindre omfattning...
Enkelt uttryckt är det en kombination av färdigskriven kod och regler för struktur för program. Det bygger på det befintliga programspråket och syftet med ett ramverk är att det ska gå snabbare att utveckla och underhålla kod för applikationer.
Express är ett ramverk för att skapa webbapplikationer på server-sidan (backend) på plattformen Node.js.
Det vi kommer använda från ramverket Express är att skapa en http-server, hantering hur olika routes sätts upp för att svara mot en speciell request metod såsom GET, POST, PUT, DELETE, för att skapa ett enkelt API. Vi ska även använda något som kallas för middleware.
* är ett frontend ramverk som är för omfattande att gå in på i denna kurs
Med routing anger vi att vissa sökvägar för vår webbapplikation ska trigga igång specifika koddelar.
Exempelvis en viss route i vår webbapplikation ska ansvara för att när:
/* 7 RESTful routes */
app.get("/dogs", function (request, response) {
response.send("Alla hundar visas");
});
app.get("/dogs/new", function (request, response) {
response.send("Visa formulär för att skapa ny hund");
});
app.post("/dogs", function (request, response) {
response.send("Skapa ny hund");
});
/* 7 RESTful routes fortsättning */
app.get("/dogs/:id", function (request, response) {
response.send("Visa specifik hund");
});
app.get("/dogs/:id/edit", function (request, response) {
response.send("Visa formulär för att uppdatera specifik hund");
});
app.put("/dogs/:id", function (request, response) {
response.send("Uppdatera specifik hund");
});
app.delete("/dogs/:id", function (request, response) {
response.send("Ta bort spcifik hund");
});
Postman är som en webbläsare där bara datat som skickas visas. Det är bra för att verifiera att alla endpoints och HTTP-metoder verkligen skickar data eller tar met data.
Vi behöver hantera variabler som är beroende på vilken utvecklingsmiljö programmet körs på, eller inställningar på servern.
Dessa variabler som exempelvis port, databasuppkoppling, databasnamn, användarnam, lösenord, m. fl., kallas för miljövariabler (eng. environment variables) och behöver hanteras separat och vara åtskilda från applikationen (exempelvis i egen fil)
D.v.s en vacker dag vill vi drifta vår applikation från att köra lokalt till live på internet :-)
Mongoose är ett bibliotek som sköter databashantering för MongoDB på Node.js
Det är Mongoose funktioner vi kommer använda för databasuppkoppling, skapa modell för våra inlägg, samt CRUD-funktionerna för databashantering
Som templatemotor ska vi använda JavaScript templating (EJS) vilken hjälper oss att rendera HTML-sidor med dynamisk information från JavaScript. D.v.s med en templatemotor kan vi generera delar av HTML-koden och skriva ut innehåll från variabler i JavaScript, så att sidornas innehåll blir dynamiskt.
Det finns även andra templatemotorer som Pug (https://pugjs.org/) och Handlebars (https://handlebarsjs.com/)
Svenska
Engelska
Att kunna
HTTP är ett protokoll som är s.k "stateless". Klienten måste upprätthålla en ny anslutning till servern vid ny förfrågan och därmed finns det inget sätt att hålla reda på status, inloggningstid etc från den klient som är ansluten. D.v.s för varje gång man ansluter till servern måste man tala om för servern vem man är :-). Den "minns" inte det!
Problemet
Istället för att varje gång ange användarnamn, lösenord eller annan information vid besök på en sida så kan webbläsaren spara den informationen. Authentiseringsuppgifterna ges alltså till servern när man authentiserar sig. Servern skickar tillbaka informationen om att man är authentiserad (session-id) till webbläsaren. För varje ny anslutning till servern skickas den informationen från webbläsaren så att servern nu vet vem man är :-)
Lösning
Text
En cookie är data (text) som kan skickas mellan server och klient över HTTP protokollet och kan lagras i webbläsaren.
Klient (webbläsare)
Server
Cookie
Cookies skickas över HTTP och sparas i webbläsaren
Detta är autentiseringsstrategin bakom Passport-Local och att vi använder paketet client-sessions. D.v.s det vi använder oss av på bloggen.
Du behöver inte förstå de olika delarna, bara ett en token uppdelad i olika delar för säkersskäl!
FÖRDJUPNING: Du behöver inte kunna detta exakt till hemprovet.
En brute-force-attack är en metod för att systematiskt gissa ett lösenord genom att testa alla möjliga tecken i alla möjliga positioner. Angriparen försöker inte vara listig och endast testa vanliga lösenord som ”password”, skippa komplexa lösenord eller endast testa vanliga sätt för att göra lösenord unika (som ”secret01”, ”secret02” osv). Utan angriparen testar allt – därav namnet brute-force-attack. Kan angriparen genomföra den här typen av attack utan att några motåtgärder sätts in, så kommer angriparen till slut få fram lösenordet.
Skydda sig mot Brute Force Attacker
Webbplatsägarens ansvar
Enskilde användarens ansvar
SPARA ALDRIG OKRYPTERADE LÖSENORD I DATABASEN
En hashfunktion är så kallad envägskryptering, vilket betyder att det inte går att återskapa originaldatat från den krypterade (eller hashade) strängen. Det finns många olika hasfunktioner, mer eller mindre avancerade och tar olika lång tid att kryptera. md5, sha256, scrypt, argon2. Den som är vanlig och rekommenderas nu är bcrypt.
Problemet med att enbart hasha lösenordet är att en eventuell hacker då kan skapa en databas som innehåller hashvärden av alla ord i en ordlista, och om inte det skulle räcka för att knäcka lösenord, så kan en hacker generera alla kombinationer upp till n tecken [a-zA-Z0-9] samt diverse icke alfanumeriska tecken. Därför bör man lägga till ett salt som är samma för alla användare. Saltet bör vara långt, gärna över 20 tecken och ha samma krav som ett vanligt lösenord. Alltså bestå av siffror och icke alfanumeriska tecken.
Hur Passport-Local gör detta åt oss! Det är inte så svårt att göra på egen hand, använd gärna paketet bcrypt
Vår hashade lösenord
Saltet
Från Wikipedia_
"Cross site scripting, XSS, är ett datorrelaterat säkerhetsproblem. XSS-säkerhetsbrister kan exempelvis användas till att kapa inloggningar genom att stjäla webbkakor eller för att modifiera en webbsidas utseende och funktionalitet.
Ett exempel på hur XSS kan modifiera en sidas utseende vore om ett formulärsfält där det är meningen att text ska skrivas inte är skyddat mot HTML-kod. Då kan användaren lägga in stora bilder eller ramar som tar upp plats och förstör utseendet på sidan. Även länkar till skadliga sidor kan då planteras där.
XSS kan också användas för att stjäla information från andra användare. Exempelvis kan vi tänka oss en webbplats där man kan skicka meddelanden till varandra. Om sajten inte är skyddad mot XSS så kan användaren X skicka ett meddelande till användare Y och få honom att klicka på en länk som via javascript automatiskt skickar hemlig information om användaren Y till användaren X. Med den informationen kan exempelvis användare X logga in som användare Y."
Viktigt att granska och rensa indata på skadlig kod. Exempelvis från att ändra "farliga" tecken som finns i körbara skript till "ofarliga" tecken. Detta kan man göra på olika sätt. Man kan också validera så att endast vissa värden är möjliga.
SQL-injektioner är ett vanligt säkerhetsproblem på webbsidor. Det uppstår genom att okontrollerad data skickas direkt in i en SQL-fråga. På så sätt ändras SQL-anropets ursprungliga funktionalitet till något annat. En SQL-injektion är ett säkerhetshål som kan uttnyttjas på många olika sätt. Databaser kan raderas, lösenord stjälas o.s.v
Skydda sig mot SQL/NoSQL-injektioner
Granska och rensa data så att skadliga databasfunktioner inte kan köras. Det brukar vara inbyggt i ramverken. Ex att använda Mongoose för NoSQL är ett bra skydd.
HTTPS gör att webbkommunikation sker genom en privat och skyddad kanal över internet. En webbplats bör alltid använda HTTPS. Särskilt om man har formulär eller visar upp innehåll som är unik för respektive användare.
Det extra S:et i HTTPS står för secure. Det är alltså en säkrare variant av HTTP. I grunden fungerar de två protokollen på liknande sätt, men med en fundamental skillnad: över HTTP-protokollet krypteras informationen som skickas mellan klient och server med SSL (Secure Socket Layer)
Svenska
Engelska