hoe moet het wel?
Hier 2 voorbeelden van GOEDE filters, de eerste is een filter waarbij de gebruiker html in mag voeren, maar.. alleen DIE html, die ik goedkeur..
en, misschien nog wel belangrijker, als ik iets filter (weghaal), zorg er dan altijd voor dat je er een lusje omheen zet, om te kijken of er niet, zoals in voorbeeld 1, na het filteren een goede tag is ontstaan.
Ook filteren deze scripts op een relatief nieuwe hack, waar Rsnake mij attent op heeft gemaakt, namelijk het gebruik van variable width characters.
http://applesoup.googlepages.com/bypass_filter.txt
hier staat hoe het precies werkt, voor mensen die geinteresseerd zijn, en nogal wat technische kennis hebben;)
het enige wat je hoeft te doen om je hiertegen te beschermen, is ervoor zorgen dat mensen geen ' of " rechtstreeks op een pagina kunnen plaatsen..
filter 1)
laat bepaalde html tags toe, en filtert de rest.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function goedfilter1($text){
$text = stripslashes($text);
//transformeert eerst de "goede" tags naar hun bb versie, zodat ze door het strip_tags filter niet aangetast worden.
$text = preg_replace("(<img src=\"([a-z0-9_\-\.\/:]+?)\"></img>)", "[img]$1[/img]", $text);
$text = preg_replace("(<b>(.+?)</b>)", "[b]$1[/b]", $text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<b>$1</b>', $text);
return $text;
}
?>
Ik ben het met je eens als je zegt dat dit een omslachtige manier is, maar, hij filtert wel ALLES, er is geen enkele manier om hier omheen te komen.. als je je character encoding niet op us-ascii zet..;)
filter 2)
UBB filter, wat (voor zover ik weet), alle xss filterd.
2
3
4
5
6
7
8
9
10
11
12
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}?>
Ik hoop dat jullie hier wat aan hebben, als je nog vragen hebt, of wil weten of jouw filter veilig is, stuur me gerust een berichtje!
~huib