webForumDet fria alternativet

Säker html-rensing?

10 svar · 383 visningar · startad av Csson

CssonMedlem sedan feb. 2000314 inlägg
#1

Har försökt göra en säker funktion för att rensa inlägg på html-taggar, och det jag har kommit fram till är detta:

$message =~ s/<([^>]|\n)*[>|\n]?//g;

Jag har försökt få den att missa taggar utan att lyckas, men kan man på något sätt överlista den, och, i så fall: Hur kan man göra en säkrare variant?

/Csson

FlashXMedlem sedan nov. 1999992 inlägg
#2

Kolla bara så att man inte kan göra img-taggar utan den avslutande > vilket brukar vara vanligt.

Säkrast är väl egentligen att förvandla < och > till motsvarande i html-kod. Fast du kanske hellre vill att dessa inlägg inte ska synas, utan raderas helt och hållet.

CssonMedlem sedan feb. 2000314 inlägg
#3

"Kolla bara så att man inte kan göra img-taggar utan den avslutande > vilket brukar vara vanligt."

Ja, det var problemet med den ursprungliga, men det går inte (iaf inte för mig) att få den att visa bilder på något sätt.

"Säkrast är väl egentligen att förvandla < och > till motsvarande i html-kod. Fast du kanske hellre vill att dessa inlägg inte ska synas, utan raderas helt och hållet."

Jo, det är det säkraste, men det blir inte så snyggt (men man ser å andra sidan när någon har försökt skriva html, vilket man kanske vill). Man kan välja (i scriptet) mellan dessa båda sätt att hantera html, och dessutom tillåta det om man vill.

/Csson

[Redigerat av Csson den 08 mar 2000]

RobbanMedlem sedan dec. 19992 272 inlägg
#4

Med ditt uttryck, som f.ö. kan förenklas till s/<[^>]*>?//g (prova, så tror jag nog du får exakt samma resultat som med ditt uttryck), får du ju effekten att om någon skriver ett inlägg med ett < i så försvinner ju hela inlägget efter detta < (om inte resten av texten innehåller ett > någonstans). Är kanske inte önskvärt alla gånger?

Den bästa metoden, enligt mig, är därför att göra som FlashX föreslår.

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 08 mar 2000]

CssonMedlem sedan feb. 2000314 inlägg
#5

Jag trodde att jag hade kontrollerat det, men det hade jag uppenbarligen inte :(. Men efter lite funderingar har jag kommit fram till denna:

s/<[^>|\n]*([>|\n]|[^>|\n]*$)//g;

Den tar bort allt från < fram till radslut eller >, men rensar inte allt efter < (om inte den aktuella raden är den sista).

/Csson

RobbanMedlem sedan dec. 19992 272 inlägg
#6

Den tar bort allt från < fram till radslut eller >, men rensar inte allt efter < (om inte den aktuella raden är den sista).

Jo, om det är ok med dig så visst (men det är ju fortfarande inte säkert att det är ett önskvärt beteende att bli av med allt mellan < och radslut - det finns ju tillfällen då man kan behöva skriva < utan att den ingår i en HTML-tag).

Kan skrivas enklare dock (du försöker t.ex. använda | innanför hakparanteserna, och om det är en OR-funktion du är ute efter så fungerar inte | som sådan där, och det behövs f.ö. inte då en sådan existerar automatiskt för alla tecken innanför [ och ]).

s/<.*?(>|\n|\z)//g;

Tror i.a.f. att detta uttryck gör samma sak som ditt - matchningen slutar vid >, vid radslut, eller vid strängslut (i de fall strängen inte innehåller vare sig > eller radslut).

------------------
Robban < robban@lipogram.com >

[Redigerat av Robban den 09 mar 2000]

CssonMedlem sedan feb. 2000314 inlägg
#7

"det finns ju tillfällen då man kan behöva skriva < utan att den ingår i en HTML-tag"

Jo, det gör ju det... Ännu en liten modifiering för att göra sådana tillfällen då den tar bort < när den inte ska så få som möjligt:

s/<[^\s\d].*?(>|\n|\z)//g;

/Csson

[Redigerat av Csson den 09 mar 2000]

RobbanMedlem sedan dec. 19992 272 inlägg
#8

Fast nu bör du nog kolla hur de olika webläsarna behandlar saker som < img src="foobar.gif"> eller <\nimg src="foobar.gif"> (som ju skulle släppas igenom).

I NN 4.7 för linux och i Lynx verkar du klara dig (har bara tillgång till dessa f.n.), men det skulle inte förvåna mig om t.ex. IE tolkade detta som en bildtag (den brukar ju släppa igenom det mesta).

------------------
Robban < robban@lipogram.com >

CssonMedlem sedan feb. 2000314 inlägg
#9

IE5 vill i varje fall inte släppa igenom någon av dom, men jag kan inte kolla tidigare versioner här. Om jag efter

s/<[^\s\d].*?(>|\n|\z)//g;

byter ut kvarvarande < och > med

s/</&amplt;/g;
s/>/&ampgt;/g;

så bör det väl bli så säkert det bara kan?

/Csson

[Redigerat av Csson den 09 mar 2000]

RobbanMedlem sedan dec. 19992 272 inlägg
#10

Jo, rent säkerhetsmässigt kan du lika gärna skippa den första satsen. Att ha med den första är ju nu en rent estetisk fråga. :)

Men om vi skall vara EXTREMT petiga och paranoida så finns det, under vissa förutsättningar, möjligheter att gå runt detta också. Nämligen om webläsaren är inställd på att använda någon annan teckentabell än vi är vana vid, och där antingen < och > inte befinner sig på samma ställe eller där det finns alternativa sätt att skriva dessa tecken. Det senare gäller t.ex. UTF7 (Unicode). Så är det maximal säkerhet du är ute efter så räcker inte ens dessa uttryck (brukar i sådana fall rekommenderas att man bara tillåter ett antal "säkra" tecken, och filtrerar bort allt annat). ;)

------------------
Robban < robban@lipogram.com >

CssonMedlem sedan feb. 2000314 inlägg
#11

Japp, det är i första hand en estetisk fråga men jag ville inte att det skulle gå ut över säkerheten. Däremot tror jag (tills vidare iaf) att jag nöjer mig med denna säkerhetsnivå, man ska ju inte gå till överdrift ;).

Tack för hjälpen :)

/Csson

Genererad på 382 ms · cache AV · v20260730165559-full.f96bc7eb