Att läsa kod — för dig utan kodvana
Den här sidan finns för att resten av kursen visar kod, och koden är meningslös om du inte kan läsa den. Du behöver inte kunna skriva kod för att gå kursen. Du behöver kunna titta på ett kodstycke och se vad det försöker göra. Det är precis vad den här sidan lär ut, och ingenting mer.
Läs den en gång nu. Kom tillbaka hit när något i en laboration ser obegripligt ut.
Tre sorters text som ser lika ut men inte är det
Nästan all kod i kursen hör till en av tre kategorier, och det första steget är att se vilken.
Terminalkommandon är instruktioner du skriver för hand och trycker Enter på. De är korta, börjar ofta med ett verb som ping, curl eller tail, och har små flaggor efter sig som -c 3 eller -I. De körs en gång och är sedan klara.
Konfigurationsfiler är inställningar, inte instruktioner. De körs inte uppifrån och ned — ett program läser dem när det startar och ställer in sig därefter. All nginx-kod i kursen är av det här slaget. Känns igen på rader av typen namn värde; och på klammerparenteser som grupperar inställningar som hör ihop.
Program är det som faktiskt utför något, rad för rad, varje gång någon besöker sidan. Python, PHP och JavaScript i kursen är program. Det är här de riktiga säkerhetsbesluten fattas.
Kommentarer: raderna som inte gör något
En kommentar är text som datorn hoppar över. Den finns där för människan som läser. Tecknet skiljer sig åt mellan språken, men funktionen är densamma:
#i Python, i terminalen och i nginx//i JavaScript, PHP, C och liknande språk--i SQL
När du ser # Sårbart ovanför ett stycke kod är det en människa som pekar på något, inte en instruktion till datorn.
Variabler: namngivna lådor
En variabel är ett namn på ett värde, så att du kan använda värdet igen utan att skriva om det. Skrivsättet skiljer sig:
- Python:
pris = 100 - PHP:
$pris = 100;— dollartecknet hör till namnet - JavaScript:
const pris = 100;—constbetyder att värdet inte ska ändras efteråt
Likhetstecknet betyder här inte "är lika med" i matematisk mening. Det betyder "lägg det här värdet i den här lådan". När du vill jämföra två saker används i stället ==, två likhetstecken.
Text, citattecken och ihopklistring
Text i kod kallas en sträng och omges alltid av citattecken: "hej" eller 'hej'. Citattecknen är inte en del av texten, de markerar bara var den börjar och slutar.
Strängar kan klistras ihop. I PHP görs det med en punkt, i Python och JavaScript med plustecken. Det låter oskyldigt, men ihopklistring av strängar är grundorsaken till hela Lab 3 — när användarens text klistras in i ett kommando kan datorn inte längre se var kommandot slutar och användarens text börjar.
Funktioner: namngivna recept
En funktion är ett stycke kod som fått ett namn, så att det kan köras när som helst utan att skrivas om. Den tar emot värden, gör något, och lämnar ofta tillbaka ett svar.
def verifiera(losenord):
...
return True
def betyder "definiera en funktion". Namnet är verifiera. Det som står i parentesen är vad funktionen tar emot. return är vad den lämnar tillbaka.
Att anropa funktionen är att skriva dess namn med parenteser efter: verifiera("hemligt"). Du ser detta överallt — ph.hash(losenord) betyder "kör funktionen hash och ge den losenord".
Punkten i ph.hash(...) betyder "hash som hör till ph". Det är ett sätt att gruppera funktioner som hör ihop.
Parenteser, klamrar och hakar
Tre olika sorters tecken grupperar tre olika saker:
( )runt det en funktion tar emot{ }runt ett block som hör ihop, eller runt en uppsättning namngivna fält[ ]runt en lista av värden, eller runt ett uppslag i en lista
I Python används dessutom indraget — hur långt in på raden koden börjar — för att visa vad som hör ihop. Rader som är indragna lika långt tillhör samma block. Det är inte dekoration; flyttar du indraget ändrar du betydelsen.
Databasfrågor
En databasfråga är en mening på språket SQL, och den liknar faktiskt engelska:
SELECT * FROM users WHERE id = 5
Läst rakt av: hämta (SELECT) alla kolumner (*) ur tabellen users där kolumnen id är 5. En tabell är ett kalkylblad: rader är poster, kolumner är fält.
Det du behöver se i kursen är var siffran 5 kommer ifrån. Om den kommer från användaren och klistras in i meningen som text, uppstår problemet i Lab 3. Om den skickas separat gör den inte det.
Bibliotek
Ett bibliotek är färdig kod som någon annan skrivit och granskat, och som du hämtar in i stället för att skriva själv. from argon2 import PasswordHasher betyder "hämta verktyget PasswordHasher ur biblioteket argon2".
Inom säkerhet är detta inte lathet utan en regel: egenhändigt skriven krypto- och rensningskod går nästan alltid sönder på sätt som inte syns förrän någon utnyttjar dem.
Att läsa terminalen
Ett $ eller # först på raden i ett exempel är prompten — datorns sätt att säga "skriv här". Den ska inte skrivas in av dig.
Flaggor är de korta tilläggen efter kommandot. -I i curl -I betyder "bara svarshuvudena". Vilken bokstav som betyder vad varierar mellan kommandon, och alla slår upp dem.
Det lodräta strecket | kallas pipe och skickar resultatet från kommandot till vänster in i kommandot till höger. curl -I sajten | grep -i policy betyder alltså: hämta huvudena, och visa bara de rader som innehåller ordet policy.
Vad du faktiskt behöver kunna
Du ska inte kunna skriva koden i den här kursen utantill. Du ska kunna titta på två kodstycken och säga vilket av dem som bygger ett kommando av användarens text, och vilket som håller dem isär. Det är hela färdigheten. Allt annat i den här kursen bygger på den.
Reading code — for those with no coding background
This page exists because the rest of the course shows code, and the code is useless if you cannot read it. You do not need to be able to write code to take this course. You need to be able to look at a piece of code and see what it is trying to do. That is exactly what this page teaches, and nothing more.
Read it once now. Come back here whenever something in a lab looks unreadable.
Three kinds of text that look alike but are not
Almost all the code in this course belongs to one of three categories, and the first step is seeing which.
Terminal commands are instructions you type by hand and press Enter on. They are short, usually start with a verb like ping, curl or tail, and carry small flags after them such as -c 3 or -I. They run once and are then finished.
Configuration files are settings, not instructions. They do not run top to bottom — a program reads them at startup and configures itself accordingly. All the nginx code in the course is of this kind. You recognize it by lines of the form name value; and by curly braces grouping settings that belong together.
Programs are what actually does something, line by line, every time someone visits the page. The Python, PHP and JavaScript in this course are programs. This is where the real security decisions are made.
Comments: the lines that do nothing
A comment is text the computer skips. It is there for the human reading. The character differs between languages, but the function is the same:
#in Python, in the terminal and in nginx//in JavaScript, PHP, C and similar languages--in SQL
When you see # Vulnerable above a piece of code, that is a human pointing at something, not an instruction to the computer.
Variables: named boxes
A variable is a name for a value, so you can use the value again without retyping it. The notation differs:
- Python:
price = 100 - PHP:
$price = 100;— the dollar sign is part of the name - JavaScript:
const price = 100;—constmeans the value will not change afterwards
The equals sign here does not mean "is equal to" in the mathematical sense. It means "put this value in this box". When you want to compare two things you use == instead, two equals signs.
Text, quotes and gluing
Text in code is called a string and is always wrapped in quotes: "hello" or 'hello'. The quotes are not part of the text, they just mark where it begins and ends.
Strings can be glued together. In PHP this is done with a dot, in Python and JavaScript with a plus sign. It sounds harmless, but gluing strings together is the root cause of the whole of Lab 3 — when the user's text is pasted into a command, the computer can no longer see where the command ends and the user's text begins.
Functions: named recipes
A function is a piece of code that has been given a name, so it can be run whenever needed without being rewritten. It receives values, does something, and often hands back an answer.
def verify(password):
...
return True
def means "define a function". The name is verify. What sits in the parentheses is what the function receives. return is what it hands back.
To call the function is to write its name with parentheses after it: verify("secret"). You see this everywhere — ph.hash(password) means "run the hash function and give it password".
The dot in ph.hash(...) means "the hash belonging to ph". It is a way of grouping functions that belong together.
Parentheses, braces and brackets
Three different characters group three different things:
( )around what a function receives{ }around a block that belongs together, or around a set of named fields[ ]around a list of values, or around a lookup into a list
Python additionally uses indentation — how far into the line the code starts — to show what belongs together. Lines indented equally far belong to the same block. This is not decoration; move the indentation and you change the meaning.
Database queries
A database query is a sentence in the SQL language, and it genuinely resembles English:
SELECT * FROM users WHERE id = 5
Read straight off: fetch (SELECT) all columns (*) from the table users where the column id is 5. A table is a spreadsheet: rows are records, columns are fields.
What you need to see in this course is where the number 5 comes from. If it comes from the user and is pasted into the sentence as text, the problem in Lab 3 appears. If it is sent separately, it does not.
Libraries
A library is finished code someone else has written and reviewed, which you pull in rather than writing yourself. from argon2 import PasswordHasher means "take the PasswordHasher tool out of the argon2 library".
In security this is not laziness but a rule: hand-written crypto and sanitizing code almost always breaks in ways that stay invisible until someone exploits them.
Reading the terminal
A $ or # at the start of a line in an example is the prompt — the computer's way of saying "type here". You do not type it yourself.
Flags are the short additions after the command. -I in curl -I means "headers only". Which letter means what varies between commands, and everybody looks them up.
The vertical bar | is called a pipe and feeds the result of the command on the left into the command on the right. So curl -I thesite | grep -i policy means: fetch the headers, and show only the lines containing the word policy.
What you actually need to be able to do
You are not expected to write the code in this course from memory. You are expected to look at two pieces of code and say which one builds a command out of the user's text, and which one keeps them apart. That is the whole skill. Everything else in this course rests on it.