[php] Door user ingevoerde html controleren en verbeteren *

Pagina: 1
Acties:
  • 105 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Ik ben bezig met een profielen systeem. Gebruikers kunnen hier ook custom profielen aanmaken dmv beperkte HTML rechten. Alleen loop ik tegen één groot probleem aan:

Als een gebruiker een " vergeet bij een tag zoals:
code:
1
2
3
<style type="text/css>

</style>

Flipt de hele pagina in Firefox. IE draai wel vrolijk door. Nu heb ik in mijn PHP boek zitten bladeren maar kon hier geen oplossing voor vinden. Is er een manier om dit tegen te houden?

Het profiel wordt bij het showen in een DIV geechoed en bij het wijzigen in een textarea. (Vanuit mySQL database d.m.v. PHP)

[ Voor 6% gewijzigd door Ebayzo op 15-12-2004 15:49 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is de link tussen PHP en de browsers :?
Ik vermoed dat het een PHP probleem is, waarom praat je dan niet over je code?


Ik lees niet goed, maar je topictitel geeft dan ook totaal niet je probleem weer. Deze ziet er wat beter uit.

[ Voor 73% gewijzigd door .oisyn op 15-12-2004 15:55 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 20:04

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Define "flippen" :) Maar goed, je kunt toch een m.b.v. php checken dat als er een <style wordt geopend, dat de complete zin er zo uit moet zien :)

Acties:
  • 0 Henk 'm!

  • RM-rf
  • Registratie: September 2000
  • Laatst online: 20:45

RM-rf

1 2 3 4 5 7 6 8 9

standaard er:

code:
1
2
3
<style type="text/css>
/* " */
</style>

neerzetten...

maar waarom allerlei 'plakbandjes-oplossingen' bedenken voor mensen die foute invoer willen ingeven, valideer liever de ingevoerde content en weiger non-validerende content op te slaan.
willen je gebruikers dan van hun HTML-rechten gebruik maken, moeten ze ook validerende code schrijven..

Intelligente mensen zoeken in tijden van crisis naar oplossingen, Idioten zoeken dan schuldigen


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Omdat internet explorer de pagina wel goed weergeeft.
EbAyzo schreef op woensdag 15 december 2004 @ 15:48:Flipt de hele pagina in Firefox. IE draai wel vrolijk door.
Het probleem zit hem in het niet compleet zijn van de tag/attribuut. Maar ik kan zo gauw niet vinden of er iets van een auto-aanvul functie is voor PHP :/

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
We Are Borg schreef op woensdag 15 december 2004 @ 15:52:
Define "flippen" :) Maar goed, je kunt toch een m.b.v. php checken dat als er een <style wordt geopend, dat de complete zin er zo uit moet zien :)
Propleem is dat het natuurlijk niet alleen in style zit. Bij elke tag die gebruikt kan worden en attributen kan bevatten kan het fout gaan:
code:
1
<a href="http://blaat.com>Blaat</a>

Daarmee gaat het ook fout dus.

Flippen:
code:
1
2
3
4
5
6
7
8
<textarea name="profiel_tekstvak" cols="80" rows="30">
<style type="text/css>

</style>
</textarea>
<a href="http://blaat">Hier</a>
</body>
</html>

Probleem is dus dat door die vergeten " alle code erachter (inclusief sluit tag van textarea) binnen de style tag valt. Hierdoor komt de rest van de code allemaal in de textarea :(

[ Voor 11% gewijzigd door Ebayzo op 15-12-2004 16:02 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • Vurabes
  • Registratie: December 2001
  • Laatst online: 21:01

Vurabes

Homo Sapiens Informaticus

Ik gebruik daarvoor XML_Beautifier van Pear, als je dat wilt gebruiken dan moet het echter wel XHTML zijn en je moet voorzichtig zijn met het gebruik van de beautified code i.v.m. problemen met inline elements en spaties. Je kan het ook gebruiken om alleen de code te valideren.

[ Voor 10% gewijzigd door Vurabes op 15-12-2004 16:03 ]

On a clear day you can C#


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Vurabes schreef op woensdag 15 december 2004 @ 16:02:
Ik gebruik daarvoor XML_Beautifier van Pear, als je dat wilt gebruiken dan moet het echter wel XHTML zijn en je moet voorzichtig zijn met het gebruik van de beautified code i.v.m. problemen met inline elements en spaties. Je kan het ook gebruiken om alleen de code te valideren.
Daarvoor moet Pear geinstalleerd zijn. Is dat standaard in PHP (of kun je het zien bij phpinfo(); ) ?
RM-rf schreef op woensdag 15 december 2004 @ 15:52:
standaard er:

code:
1
2
3
<style type="text/css>
/* " */
</style>

neerzetten...

maar waarom allerlei 'plakbandjes-oplossingen' bedenken voor mensen die foute invoer willen ingeven, valideer liever de ingevoerde content en weiger non-validerende content op te slaan.
willen je gebruikers dan van hun HTML-rechten gebruik maken, moeten ze ook validerende code schrijven..
Maar ja...dan moet er weer een parser gebouwd worden. En zit op het moment met een deadline (aangezien het een schoolproject is) dus een "plakbandjes-oplossing" zou op het moment best even mogen.

[ Voor 58% gewijzigd door Ebayzo op 15-12-2004 16:16 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

  • Vurabes
  • Registratie: December 2001
  • Laatst online: 21:01

Vurabes

Homo Sapiens Informaticus

Daarvoor heb je inderdaad Pear nodig, je kan gewoon uitproberen of het erop staat maar op de meeste shared hosts is dat niet het geval. Je kan het dan vaak wel zelf installeren met go-pear. Een manual daarvoor staat hier en go-pear zelf staat hier.

On a clear day you can C#


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Vurabes schreef op woensdag 15 december 2004 @ 16:18:
Daarvoor heb je inderdaad Pear nodig, je kan gewoon uitproberen of het erop staat maar op de meeste shared hosts is dat niet het geval. Je kan het dan vaak wel zelf installeren met go-pear. Een manual daarvoor staat hier en go-pear zelf staat hier.
Dan ga ik eerst even lezen of dit wel dé oplossing is. Want XHTML invoer klinkt me al helemaal niet fijn in de oren...(zeker omdat ik met ultra-noob gebruikers werk)

Wat wel vaag is dat internetexplorer wel gewoon doorgaat. Die zet alles netjes op het scherm zoals het (niet) hoort.

[ Voor 11% gewijzigd door Ebayzo op 15-12-2004 16:27 ]

Default blanke hetero


Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb hiervoor ooit een reparatie iets geschreven. Niet verschrikkelijk fraai, maar werkt wel prima. Deze is geschreven omdat ik FckEditor gebruikte, en die fucked nog wel eens up op het gebied van aanhalingstekens en slashes.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php


// function repairs a complete block of content
// input : content, 
// output : repaired content

function za_repair_content($input)
  {$ret = za_repair_attribute($input, 'class'); 
   $ret = za_repair_attribute($ret, 'padding');
   $ret = za_repair_attribute($ret, 'target');
   $ret = za_repair_attribute($ret, 'colspan');
   $ret = za_repair_attribute($ret, 'rowspan');
   $ret = za_repair_attribute($ret, 'border');
   $ret = za_repair_attribute($ret, 'cellspacing');
   $ret = za_repair_attribute($ret, 'cellpadding');
   $ret = za_repair_attribute($ret, 'color');  
   $ret = za_repair_attribute($ret, 'target');
   $ret = za_repair_attribute($ret, 'width');
   $ret = za_repair_attribute($ret, 'height');
   $ret = za_repair_attribute($ret, 'value');
   $ret = za_repair_attribute($ret, 'size');
   $ret = za_repair_attribute($ret, 'maxwidth');
   return $ret;
  };

// function repairs a single tag type within a block of content
// input: content and attribute to be repaired
// output = repaired content 

function za_repair_attribute($input, $attribute)
  {$todo = $input;
   $done ='';
   while (strpos($todo, '<') !== false)
     {$posstart=strpos($todo, '<');
      $done=$done.substr($todo,0,$posstart+1);         
      $todo=substr($todo,$posstart+1,strlen($todo));               
      $posend=strpos($todo, '>');
      if ($posend!==false)
          {$tag=substr($todo,0, $posend);         
           $tag=za_repair_tag($tag, $attribute);
           $todo=substr($todo,$posend+1,strlen($todo));
           $done=$done.$tag.'>';              
          };     
     }
   return $done.$todo;
  };


// function repairs tags
// input: content of tag, attribute to be repaired
// output: repaired tag

function za_repair_tag($input, $attribute)
  {$ret = "";
   $pos=strpos(strtoupper($input), strtoupper($attribute));
   if ($pos===false)
       {$ret=$input;}
     else  
       {if (substr($input, $pos+strlen($attribute),1)=="=" && substr($input, $pos+strlen($attribute)+1,1)!="\"" && substr($input, $pos+strlen($attribute)+1,1)!='"')
            {$done=substr($input, 0, $pos+strlen($attribute)+1).'"';
             $todo=substr($input, $pos+strlen($attribute)+1);
             $pos=strpos($todo,' ');
             if ($pos===false)
                 {$ret=$done.$todo.'"';}
               else
                 {$ret=$done.substr($todo,0,$pos).'"'.substr($todo, $pos);};
            }
          else
            {$ret=$input;};
       }   
   return $ret;  
  };
?>


Als je nu een stuk content hebt waarin een tag zit die niet klopt, kun je 'm fixxen door 'm hierdoorheen te trekken.

Bv.
code:
1
$content = za_repair_content($content);


Hierna zijn alle tags welke genoemd zijn in za_repair_content gefixxed. Voordat mensen het gaan zeggen; idd niet de meest efficiente wijze om dit te doen, dit is echter niet de gehele code die hier staat, er zijn echt redenen om het zo te doen ;)

't is zeker niet de mooiste code ooit geschreven, maar ja, van nature Delphi programmeur en toen geen tijd om dit helemaal netjes te doen.. als je dingen ziet; zeg het gerust :)

[ Voor 18% gewijzigd door Verwijderd op 15-12-2004 16:29 ]


Acties:
  • 0 Henk 'm!

  • Ebayzo
  • Registratie: Juli 2001
  • Laatst online: 17-10-2022
Tnx voor de oplossingen! Ik ga ze even allemaal bekijken....

[ Voor 112% gewijzigd door Ebayzo op 15-12-2004 16:54 ]

Default blanke hetero

Pagina: 1