Most recent comments
2021 in Books -- a Miscellany
Are, 2 years, 11 months
Moldejazz 2018
Camilla, 5 years, 4 months
Romjulen 2018
Camilla, 5 years, 11 months
Liveblogg nyttårsaften 2017
Tor, 6 years, 11 months
Selvbygger
Camilla, 1 month, 4 weeks
Bekjempelse av skadedyr II
Camilla, 11 months
Kort hår
Tor, 3 years, 11 months
Ravelry
Camilla, 3 years, 6 months
Melody Gardot
Camilla, 5 years, 5 months
Den årlige påske-kommentaren
Tor, 5 years, 8 months
50 book challenge
Camilla, 11 months, 3 weeks
Ten years ago
Nissebading
Tor
Controls
Register
Archive
+ 2004
+ 2005
+ 2006
+ 2007
+ 2008
+ 2009
+ 2010
+ 2011
+ 2012
+ 2013
+ 2014
+ 2015
+ 2016
+ 2017
+ 2018
+ 2019
+ 2020
+ 2021
+ 2022
+ 2023
+ 2024

bleach

En av tingene jeg har gruet meg mest til å skrive i arbeidet med nye Calcuttagutta har vært et filter som håndterer teksten vi putter inn. Det er jo slik at vi må tillate at noe html kommer gjennom, sånn som formattering, bilder, bildeplassering etc., men samtidig er det jo slik at hvem som helst kan registrere seg og legge inn kommentarer, så vi kan ikke tillate alt mulig rart heller.

Standardoppførselen til django er at den escaper absolutt alt før det går inn i databasen, og så putter det rett ut igjen, slik at hvis du prøver å skrive kursiv vil det i stedet stå <i>kursiv</i>. I utgangspunktet er altså sikkerheten godt ivaretatt, men ikke brukervennligheten.

Først så jeg for meg at jeg kanskje måtte skrive mitt eget filter. Det er to måter man kan gjøre dette på. Man kan enten lage et eget filter for å fjerne all slem kode, og bruke det i stedet for djangos innebygde super-rens som fjerner alt, eller man kan la django gjøre jobben først, og så lage et script som tilbakesubstituerer det man vil tillate. Den første tilnærmingen er veldig vanskelig. Vanskeligere enn man skulle tro, faktisk. Jeg så for meg at det ville være gjennomførbart hvis man var tilstrekkelig god i regular expressions, men så kom jeg over en forumpost der det ble hevdet at det faktisk kan bevises at man ikke kan parse html med regexps, på grunn av noe med språk og nivåer og noe annet som hørtes ut som ekte vitenskap. Jeg finner den ikke akkurat nå, men denne er mye morsommere, om enn noe mindre saklig. Jeg sakser:

Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide.


Den andre tilnærmingen, å tilbakesubstituere snill kode, er enklere, og konsekvensene av å gjøre feil er mindre, men det er fortsatt ikke trivielt. Jeg ville derfor helst unngå å måtte skrive mitt eget filter.

Digresjon: Disse to fremgangsmåtene, altså å fjerne kun slem kode, eller å først fjerne all kode, og så putte den snille tilbake igjen, kalles henholdsvis blacklist og whitelist. Whitelist er tryggere, siden det kun krever at du vet at listen din ikke inneholder potensielt farlige tags, mens en blacklist krever at du inkluderer alle potensielt farlige tags, som er en mye vanskeligere oppgave.

Jeg sjekket litt rundt, blant annet på django-users, men det er faktisk overraskende vanskelig å finne en standard måte å håndtere dette problemet på. Jeg fant imidlertid flere henvisninger til html5lib, som ser ut til å kunne gjøre jobben. Det kan imidlertid gjøre mye annet også, og virket litt komplisert å sette seg inn i, pluss at det bruker en hardkodet whitelist, så det er ikke superenkelt å tilpasse. Og tilpasning er nødvendig. Jeg vil for eksempel ikke tillate de samme tagene i en tittel eller en lynforumpost som i en artikkel eller en kommentar. Jeg utsatte derfor problemet, og brukte et par måneder på andre ting.

Nå nylig returnerte jeg til dette problemet, siden det er en av de viktiste tingene jeg må fikse før vi kan ta i bruk djangogutta, og denne gangen kom jeg over et verktøy som heter bleach. Det er en html-rensker for python, skrevet av en fyr som er webutvikler hos Mozilla, så jeg føler meg rimelig sikker på at det er bra saker. Den er basert på html5lib, men skrevet slik at det er kjempelett å bruke en egen whitelist, så han har essensielt gjort det jeg hadde sett for meg at jeg måtte gjøre, bare at det sikkert er bedre.

Jeg har derfor installert denne pakken på serveren vår (jeg installerte den i en katalog på hjemmeområdet, og la til denne i pythonpathen (la meg nok en gang nevne at jeg er kjempefornøyd med subsys)), og tatt den i bruk. Foreløpig tillater vi følgende tags i artikler og kommentarer:

'a', 'b', 'blockquote', 'br', 'caption', 'center', 'cite', 'div', 'em', 'font', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'label', 'li', 'ol', 'p', 'small', 'span', 'strong', 'sub', 'sup', 'table', 'td', 'th', 'tr', 'tt', 'u', 'ul'

og disse i titler:

'b', 'br', 'i', 'sub', 'sup', 'u'

Hvis noen ser en som ikke burde være med, eller vil legge til en ekstra man ikke kan leve uten, er det bare å si fra. Sjekk det ut på www.presskanne.com.

Og en ting til, bleach kommer også med en linkify-funksjon, så jeg tror vi kommer til å gå for auto-linkifisering i lynforumet. Jeg begynner å bli lei av alle problemene vi har hatt på det området.

-Tor Nordam

Comments

Jørgen,  03.07.10 14:52

Du kan gjøre verre ting enn å ta en kikk på denne siden, Tor.

Tor,  03.07.10 17:18

Hmm. Jeg kikket i utgangspunktet litt på slike ting som dette, og på kurs-hjemmeside-opplegget mitt bruker jeg noe som heter Markdown, som er mye det samme som Textile. Grunnen til det er at det tillater enkel formatering, som er alt man trenger på en slik hjemmeside, uten at jeg trenger å tenke på html-filtrering.

Nå har jeg imidlertid oppdaget at det er kjempelett å tillate bare de delene av html jeg ønsker, så da tror jeg nok at jeg kommer til å gå for html på kurs-hjemmesiden.

På Calcuttagutta tror jeg det er like greit å bare gå for html. For de som ikke kan det fra før er det ikke vanskelig å lære seg det man trenger i en typisk artikkel, og de som kan html fra før slipper å lære seg et nytt markup-språk. Jeg tipper dessuten man har litt bedre kontroll over plassering av bilder og bildetekst på den måten. Men si gjerne fra om du er uenig. Det er jo forsåvidt mulig å tillate begge deler.

Hvis vi virkelig vil ta den helt ut kan vi jo gå for noe slikt som javascript-word.
Category
Technology
Tags
utvikling
bleach
html
regular expressions
Views
4857
Google hits
3
Last google search
bildeplassering textile