webForumDet fria alternativet

Tillåta viss html-kod

PHPur PHP

9 svar · 805 visningar · startad av Asa

Medlem sedan dec. 20011 860 inlägg
Frågan#1

Jag vill kunna tillåta viss html-kod på en sida. Och resten skall ej vara tillåtet och visas med ex <b> ... </b>

<?php
function fixCode($sHTML){
	$sHTML=ereg_replace("<bla>","<font color='blue'>",$sHTML);
	$sHTML=ereg_replace("</bla>","</font>",$sHTML);
	$sHTML=ereg_replace("<lila>","<font color='purple'>",$sHTML);
	$sHTML=ereg_replace("</lila>","</font>",$sHTML);
	$sHTML=ereg_replace("<kursiv>","<i>",$sHTML);
	$sHTML=ereg_replace("</kursiv>","</i>",$sHTML);
	return $sHTML;
}
$strangen = "<b>Hej</b> - <kursiv>Hejsan</kursiv>";
echo fixCode($strangen);
?>
Medlem sedan apr. 2006409 inlägg
#2

Vill du ha hjälp med något?

Medlem sedan dec. 20011 860 inlägg
#3

Ja, jag vill kunna ha en spärr för all htmlkod utan den kod som jag själv väljer skall tillåtas. Ska även kunna föra som ovan och ge egna koder för ex kursiv stil m.m

Medlem sedan mars 2006296 inlägg
#4

Det finns en inbyggd funktion som heter strip_tags(), man kan även ange taggar som tillåts. Vet dock inte vad den funktionen gör med dina specialtaggar...

http://se.php.net/manual/en/function.strip-tags.php

Medlem sedan apr. 2006409 inlägg
#5

Jag har inget på lager, men du kan ju testa att byta ut det som matchar i strängarna.

$match = array('<font','</font>','<i>','</i>');
$replace = '';//vet inte om du vill ha något, peta in det i sa fall?
function html_cleaner($text,$replace,$match)
{
         $text = str_replace($match,$replace,$text);
return $text;
}

Koden är helt otestad.

Medlem sedan mars 2001185 inlägg
#6

Denna funktionen fungerar så länge det inte är några attribut på din "HTML"-kod.

<?php

/**
 * Tags to replace inside prettify-function
 */
$prettify_tags = array(
    'bla'    => '<font color="blue">$1</font>',
    'lila'   => '<font color="purple">$1</font>',
    'kursiv' => '<i>$1</i>',
);

/**
 * Prettify text
 * 
 * @param Unsafe string, input
 * @param Charset to use for htmlspecialchars
 * @param Quote style to use for htmlspecialchars, default no escape of quotes
 * @return Safe string
 */
function prettify($us, $charset = 'ISO-8859-1', $quote_style = ENT_NOQUOTES)
{
    global $prettify_tags; // This should really be a class, but global works

    // Always escape HTML
    $s = htmlspecialchars($us, $quote_style, $charset);

    foreach ($prettify_tags as $tag => $replace) {
        // &lt; and &gt; because the < and >'s are escaped above
        $s = preg_replace("@&lt;$tag&gt;(.*?)&lt;/$tag&gt;@", $replace, $s);
    }

    return $s;
}

En liten test-suite:

<?= prettify('<kursiv>Kursiv text</kursiv> <b>Fet text</b><script>alert("XSS!!!!");</script><bla>Blå text</bla>') ?>

=>
<i>Kursiv text</i> &lt;b&gt;Fet text&lt;/b&gt;&lt;script&gt;alert("XSS!!!!");&lt;/script&gt;<font color="blue">Blå text</font>
Medlem sedan dec. 20011 860 inlägg
#7

Tackat så mycket alla

Medlem sedan mars 2001185 inlägg
#8

Som ett svar på din fråga (applicerat i ovanstående funktion):

Steg 1: escapea all HTML.
Steg 2: gå igenom varje tagg och ändra <tagg> (escapeade <>) till <riktig html-tagg></riktig html-tagg>.
Steg 3: skriv ut den nya strängen.
Steg 4: det finns inget steg fyra. (Vidareutveckling kan dock vara att steg tre blir "kolla så att <bla>textsom ska bli<lila>lila</bla> men som ska bli blå</lila> inte funkar, eller funkar bättre")

Medlem sedan apr. 2006409 inlägg
#9

Just fan, min kod kollar ju inte fall strängen innehåller fel antal taggar. Det kan ställa till hela sidan. Sorry!

Medlem sedan dec. 20011 860 inlägg
#10

Ibland kan det bli lite fel men sånt som händer. Tack allesammans..

132 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)