Avatar billede lsolesen Nybegynder
03. maj 2004 - 16:36 Der er 6 kommentarer og
1 løsning

funktion til strip_not_allowed_attr()

Jeg har forsøgt at lave en funktion, der sletter attributter, som jeg ikke vil tillade:

function strip_not_allowed_attr($text) {

  // *******************************************
  $allowed_attr=array("title", "href", "summary", "for", "type", "id", "name", "method", "action", "cite");
  // *******************************************

  $search_before  = array();
  $replace_before = array();
  $search_after  = array();
  $replace_after  = array(); 
  $i = 1;
 
  foreach($allowed_attr AS $item) {
      $search_before[] = ("'".$item."='");
    $replace_before[] = "__".$i."__";
      $search_after[] = ("'__".$i++."__'");
    $replace_after[] = ($item."=");   
  }
 
  $text = preg_replace($search_before, $replace_before, $text); 
  $stripAttrib = array("' ([a-zA-Z]*?)=\"(.*?)\"'i","' ([a-zA-Z]*?)=\'(.*?)\''i");
  $text = stripslashes($text);
  $text = preg_replace($stripAttrib, '', $text); 
  $text = preg_replace($search_after, $replace_after, $text);
    $text = addslashes($text);
 
  return trim($text);
}

Men den fejler, hvis jeg fx skriver <a onclick=ond_function()>Ond funktion</a>; Er der nogen, der kan hjælpe med det, så den ikke kan snydes?

Samtidig vil jeg gerne sikre mig, at linket inde i fx src og href er regelrette links. Til det har jeg følgende tjek:

if(ereg("(http|ftp|https)://[-A-Za-z0-9._/]+", $var['url'])) { // link er ok }

Jeg vil imidlertid gerne, hvis man på en eller anden måde kunne kombinere den øverste funktion med det?
Avatar billede coderdk Praktikant
03. maj 2004 - 17:07 #1
I kommentarerne på http://dk.php.net/strip_tags er der en der har postet præcist hvad du ønsker - En der tillader nogle tags og nogle attributter...
Avatar billede lsolesen Nybegynder
03. maj 2004 - 23:08 #2
Egentlig bør funktionen hedde keep_only_allowed_attr(), for jeg vil gerne beholde de attributter, som jeg synes er i orden - og ikke slette dem jeg tror kan være farlige. Den eneste funktion på strip_tags, der gør det, kan jeg ikke få til at virke, nemlig følgende:

<?php
function stripeentag($msg,$tag,$attr) {
  $lengthfirst = 0;
  while (strstr(substr($msg,$lengthfirst),"<$tag ")!="")
  {
  $imgstart = $lengthfirst + strpos(substr($msg,$lengthfirst), "<$tag ");
  $partafterwith = substr($msg,$imgstart);
  $img = substr($partafterwith,0,strpos($partafterwith,">")+1);
  $img = str_replace(" =","=",$msg);
  $out = "<$tag";
  for($i=1;$i<=count($attr);$i++)
  {
    $val = filter($img,$attr[$i]."="," ");
    if(strlen($val)>0) $attr[$i] = " ".$attr[$i]."=".$val;
    else $attr[$i] = "";
    $out .= $attr[$i];
  }
  $out .= ">";
  $partafter = substr($partafterwith,strpos($partafterwith,">")+1);
  $msg = substr($msg,0,$imgstart).$out.$partafter;
  $lengthfirst = $imgstart+3;
  }
  return $msg;
}

echo stripeentag('<a href="" onclick="" test="">Test</a>', "a", array("href", "test"));

?>
Avatar billede sostack Nybegynder
04. maj 2004 - 11:30 #3
Her er lidt at bygge videre på:
<?php
function allow_attribs($text)
{
    $allowed_attr=array("title", "href", "summary", "for", "type", "id", "name", "method", "action", "cite");
    $test_text = explode(" ", $text);
    foreach($test_text as $value)
    {
        if(strstr($value, "="))
        {
            $test_value = explode("=", $value);
            if(!in_array($test_value[0], $allowed_attr))
            {
                unset($test_value);
            } else {
                $tested_value[] = implode("=", $test_value);
            }
        } else {
            $tested_value[] = $value;
        }
    }
    $tested_text = implode(" ", $tested_value);
    return $tested_text;
}

echo allow_attribs("<a onclick=Fejl_kode(); title='test' href='http://www.dr.dk' type='textlink'> www.dr.dk </a>");

?>

//sostack
Avatar billede lsolesen Nybegynder
05. maj 2004 - 10:00 #4
sostack -> det er en god funktion, som sagtens kan erstatte min gamle af den simple årsag, at den virker også på onclick=fejl_kode(); Den er også mere elegant.

Jeg er efterhånden kommet frem til, at jeg sikkert bliver nødt til at hive alle urls ud af inputtet, hvis jeg skal validere linkene. Hvis de så ikke opfylder mit kriterium for links, må jeg forkaste hele posten. Er det ikke rigtigt?

Smid lige et svar sostack :)
Avatar billede sostack Nybegynder
05. maj 2004 - 10:12 #5
Du kan sikker ikke gætte dig frem til hvad det rigtige skulle have været i et link der ikke opfylder dine krav, så du bliver nok nødt til at forkaste det helt....

//sostack
Avatar billede lsolesen Nybegynder
05. maj 2004 - 10:23 #6
Nej, det tror jeg ikke, at jeg behøver. Det er kun for at undgå, at folk putter noget skidt ind i et link, fx nogle scripttags eller lignende. Så skal url'en bare opfylde et mønster, jeg bestemmer, så jeg tror nu sagtens, at det kan lade sig gøre :)
Avatar billede lsolesen Nybegynder
16. september 2004 - 07:39 #7
Tak for forsøget. Du får nogle point!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester