WORDS
När behövs escape-tecken?
Escape-tecken har två stora kategorier användningsfall: hårdkodat i din egen kod, och när du har fått en sträng som input som behöver användas i en särskild kontext.
Din egen kod
Om du behöver en sträng som innehåller ett citattecken, så kanske ditt programmeringsspråk stödjer bakvänt snedstreck som escape-tecken: "\"dubbelfnutt\" är synonym till citattecken"
.
Ibland kan det också vara något tecken som du inte kan inkludera i en sträng direkt, såsom radbrytning: "- Hej!\n- Hejsan!"
. Många programmeringsspråk låter teckenkombinationen \n
motsvara en radbrytning.
I regex har många tecken en särskild betydelse. En punkt .
kan t.ex. stå för "vilket tecken som helst", då om du vill matcha en sträng som innehåller just punkt, så måste du escapa den: 0\.0
.
Använda i ny kontext
Alla strängar som du inte hårdkodar - t.ex. från användaren eller från en databas - behöver du escapa innan du kan använda dom i en SQL-fråga eller på en HTML-sida.
Om du har ett formulär där användaren kan skriva in sitt namn, så måste du kanske escapa inputen innan du skickar vidare den till databasen. Låt säga att användaren heter O'Connell. Om din SQL-fråga ser ut såhär:
INSERT INTO addresses (name, city)
VALUES ('%s', '%s');
...och %s
direkt ersätts med din input, så kan du råka ut för ett resultat som detta:
INSERT INTO addresses (name, city)
VALUES ('O'Connell', 'Galway');
Nu har det blivit fel med fnuttarna! Istället behöver du använda en escape-metod som bl.a. ersätter alla enkelfnuttar med just det som din databas stödjer. Ibland ska det vara \'
medan andra databaser stödjer duplicering av tecknet ''
.
Om du inte gör detta eller använder någon annan metod för att hindra denna typ av problem, så kan du riskera två av dom vanligaste attackerna: SQL-injektion och webbkodinjektion (XSS).
Exempel på vanliga kontexter som kräver särskild åtanke:
- Url:er
- SQL
- HTML
- JSON
- Javascript
- Shell-kommandon
Vi ska gå igenom hur man kan gå tillväga i alla dessa sammanhang.