Mr Vest
Sjefen over alle sjefer!
For en tid tilbake fikk jeg en flott kodesnutt fra en hyggelig kar her på forumet som skulle strippe bort det verste fra tekst brukeren har lagt inn i en input, i mitt tilfelle ved bruk av et textarea med TinyMCE. Jeg finner ikke igjen tråden, men koden var slik:
Det jeg nå legger merke til som jeg faktisk ikke forstår, det er at dersom jeg skriver et "innlegg" og skal publisere dette, da kjører det gjennom denne koden. Resultatet etter dette har gått gjennom koden er ingenting. Absolutt alt blir nemlig filtrert bort. Dette er den eneste koden jeg kjører dette gjennom før det blir lagt opp i databasen.
Taggene jeg har brukt i et tilfelle hvor dette skjer:
Merk: Dette skjer ikke alltid. Det skjer kun dersom jeg bruker enkelte tagger, men jeg er usikker på hvilken. De som jeg har nevnt over har jeg akkurat testet, og ja, resultatet blir tomt dersom jeg bruker disse taggene. Hvilken av disse taggene er det som gjør at dette går galt?
PHP:
$string=$_POST['content'];
function _strip_attributes($string,$allowtags='<embed><object><b><br><br /><center><i><p><strong><u><ul><li><ol><h1><h2><h3><h4><h5><h6><span><em>',$allowattributes=NULL) {
if($allowattributes) {
if(!is_array($allowattributes)) $allowattributes = explode(",",$allowattributes);
if(is_array($allowattributes)) $allowattributes = implode("|",$allowattributes);
$rep = '/([^>]*) ('.$allowattributes.')(=)(\'.*\'|".*")/i';
$string = preg_replace($rep,'$1 $2_-_-$4',$string);
}
$string = preg_replace('/([^>]*) (.*)(=\'.*\'|=".*")(.*)/i','$1$4',$string);
$rep = '/([^>]*) ('.$allowattributes.')(_-_-)(\'.*\'|".*")/i';
if($allowattributes) $string = preg_replace($rep,'$1 $2=$4',$string);
return strip_tags($string,$allowtags);
}
function _strip_javascript($filter){
# realign javascript href to onclick
$filter = preg_replace("/href=(['\"]).*?javascript:(.*)?\\1/i","onclick=' $2 '",$filter);
# remove javascript from tags
while( preg_match("/<(.*)?javascript.*?\(.*?((?>[^()]+)|(?R)).*?\)?\)(.*)?>/i",$filter)) {
$filter = preg_replace("/<(.*)?javascript.*?\(.*?((?>[^()]+)|(?R)).*?\)?\)(.*)?>/i","<$1$3$4$5>",$filter);
}
# dump expressions from contibuted content
if(0) {
$filter = preg_replace("/:expression\(.*?((?>[^(.*?)]+)|(?R)).*?\)\)/i","",$filter);
}
while(preg_match("/<(.*)?:expr.*?\(.*?((?>[^()]+)|(?R)).*?\)?\)(.*)?>/i",$filter)) {
$filter = preg_replace("/<(.*)?:expr.*?\(.*?((?>[^()]+)|(?R)).*?\)?\)(.*)?>/i", "<$1$3$4$5>", $filter);
}
# remove all on* events
while(preg_match("/<(.*)?\s?on.+?=?\s?.+?(['\"]).*?\\2\s?(.*)?>/i",$filter)) {
$filter = preg_replace("/<(.*)?\s?on.+?=?\s?.+?(['\"]).*?\\2\s?(.*)?>/i", "<$1$3>", $filter);
}
return $filter;
}
$string = _strip_javascript($string);
$string = _strip_attributes($string);
Det jeg nå legger merke til som jeg faktisk ikke forstår, det er at dersom jeg skriver et "innlegg" og skal publisere dette, da kjører det gjennom denne koden. Resultatet etter dette har gått gjennom koden er ingenting. Absolutt alt blir nemlig filtrert bort. Dette er den eneste koden jeg kjører dette gjennom før det blir lagt opp i databasen.
Taggene jeg har brukt i et tilfelle hvor dette skjer:
<p></p><strong></strong><span style="text-decoration: underline;"></span>
Merk: Dette skjer ikke alltid. Det skjer kun dersom jeg bruker enkelte tagger, men jeg er usikker på hvilken. De som jeg har nevnt over har jeg akkurat testet, og ja, resultatet blir tomt dersom jeg bruker disse taggene. Hvilken av disse taggene er det som gjør at dette går galt?