login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Eregi_replace error

Offline Crain - 26/01/2014 22:19
Avatar van CrainNieuw lid Beste leden,

Er iseen error melding van iemand website te zien:

  1. $bericht = eregi_replace("\[url\]www.([^\[]*)","<a href=\"http://www.\\1\" target=\"_blank\">\\1", $bericht);
  2. $bericht = eregi_replace("\\[url\\]www.([^\\[]*)\\[/url\\]", "<a href=\"http://www.\\1\" target=\"_blank\">\\1</a>", $bericht);
  3. $bericht = eregi_replace("\\[url\\]([^\\[]*)\\[/url\\]","<a href=\"\\1\" target=\"_blank\">\\1</a>", $bericht);
  4. $bericht = eregi_replace("\\[url=([^\\[]*)\\]([^\\[]*)\\[/url\\]","<a href=\"\\1\" target=\"_blank\">\\2</a>", $bericht);


Ik heb even gegoold, blijkt dat eregi_replace niet meer van deze tijd wordt gebruikt, maar preg_replace.

Ik heb preg_replace ipv eregi_replace gewijzigd, is niet gelukt volgens mij wordt tussenhaak " niet meer gebruikt, kom ik steeds niet uit.

Heeft iemand een idee waar het kan liggen.

Bedankt.

11 antwoorden

Gesponsorde links
Offline vinTage - 26/01/2014 22:34 (laatste wijziging 26/01/2014 22:35)
Avatar van vinTage Nieuw lid Delimiters gebruiken.
edit, de hoogst gewaardeerde reactie lezen.
Offline UpLink - 26/01/2014 22:41 (laatste wijziging 26/01/2014 22:42)
Avatar van UpLink ... Volgens mij is het dit:

  1. $bericht = preg_replace("/\[url\]www.([^\[]*)/","<a href=\"http://www.\\1\" target=\"_blank\">\\1", $bericht);
  2. $bericht = preg_replace("/\\[url\\]www.([^\\[]*)\\[/url\\]/", "<a href=\"http://www.\\1\" target=\"_blank\">\\1</a>", $bericht);
  3. $bericht = preg_replace("/\\[url\\]([^\\[]*)\\[/url\\]/","<a href=\"\\1\" target=\"_blank\">\\1</a>", $bericht);
  4. $bericht = preg_replace("/\\[url=([^\\[]*)\\]([^\\[]*)\\[/url\\]/","<a href=\"\\1\" target=\"_blank\">\\2</a>", $bericht);


Om van eregi_replace naar preg_replace te gaan moet elke "pattern" ingesloten worden. In dit geval heb ik een / gebruikt, maar eigenlijk is elk niet-alfanumeriek, niet-backslash en een karakter dat geen "spatie" vertegenwoordigd of is (ik hoop dat ik het goed uitleg).

Dit zijn bijvoorbeeld geldige karakters om die insluiting te maken:

/, #, ~, +, %, @, !, < en >

Correcties mogen natuurlijk altijd gegeven worden. Ben niet 100% zeker.
Offline vinTage - 26/01/2014 23:03
Avatar van vinTage Nieuw lid Dat zijn delimiters 
Bedankt door: UpLink
Offline Thomas - 27/01/2014 00:53 (laatste wijziging 27/01/2014 10:31)
Avatar van Thomas Moderator @UpLink: heb jij jouw oplossing getest? Bij mij krijg ik allerlei warnings :/.
Je escaped je delimiter niet in [/url]... Daarnaast staan deze preg_replaces de invoeging van JavaScript toe. En de eerste preg_replace breekt de tweede...
Test je oplossingen!

---

Ik denk dat je in de problemen komt als je er vanuit gaat dat je url begint met "www". Als je deze functionaliteit hebt staan op je site (www.test.com) dan wordt je link (bijvoorbeeld www.nu.nl) mogelijk: www.test.com/www.nu.nl of iets dergelijks.

Daarnaast lijken de expressies ongeveer hetzelfde te doen.

En last but not least wordt je user input niet ge-escaped, dus kan allerlei rottigheid (javascript enzo) bevatten.

Een veilige(re) variant die ik zo snel in elkaar heb gezet:

  1. $bericht = preg_replace_callback('#\[url(=(.*))?](.*)\[/url]#sU', 'urlCallback', $bericht);
  2.  
  3. function urlCallback($matches) {
  4. if (empty($matches[2])) {
  5. // variant [url]...[/url]
  6. return '<a href="'.htmlspecialchars($matches[3], ENT_QUOTES).'" target="_blank">'.htmlspecialchars($matches[3], ENT_QUOTES).'</a>';
  7. } else {
  8. // variant [url=...]...[/url]
  9. return '<a href="'.htmlspecialchars($matches[2], ENT_QUOTES).'" target="_blank">'.htmlspecialchars($matches[3], ENT_QUOTES).'</a>';
  10. }
  11. }


Maar dit geheel zou eigenlijk zelf ook in een functie (of klassemethode moeten zitten). Let ook op de pattern modifiers "s" (een link kan over meerdere regels lopen) en "U" (ungreedy, als er meerdere links op één regel staan gaat dit anders fout).

Probeer de volgende testcase maar eens zonder "s" en/of "U" pattern modifier aan te roepen:
  1. <?php
  2. $bericht = '[url]www.nu.nl[/url] lalalala [url]www.hoi.nu[/url]. Dus [url=http://www.whatever.com] as
  3. fd[/url]';
  4. ?>


En je kunt dus ook je regexps en HTML code stukken netter/leesbaarder schrijven als je de juiste delimiters en quotes kiest...

EDIT: En als je per se wilt dat een URL met http(s) begint:
  1. $bericht = preg_replace_callback('#\[url=(http[s]?://.*)](.*)\[/url]#sU', 'urlCallbackOne', $bericht);
  2. $bericht = preg_replace_callback('#\[url](http[s]?://.*)\[/url]#sU', 'urlCallbackTwo', $bericht);
  3.  
  4. function urlCallbackOne($matches) {
  5. // variant [url=...]...[/url]
  6. return '<a href="'.htmlspecialchars($matches[1], ENT_QUOTES).'" target="_blank">'.htmlspecialchars($matches[2], ENT_QUOTES).'</a>';
  7. }
  8.  
  9. function urlCallbackTwo($matches) {
  10. // variant [url]...[/url]
  11. return '<a href="'.htmlspecialchars($matches[1], ENT_QUOTES).'" target="_blank">'.htmlspecialchars($matches[1], ENT_QUOTES).'</a>';
  12. }


Deze laatste variant is wellicht iets veiliger, omdat je in de eerste mogelijk (makkelijker) JavaScript kwijt kunt...

Je kunt dit natuurlijk ook uitbreiden naar andere protocollen, maar met http(s) heb je de meest gangbare.
Offline Crain - 27/01/2014 23:03
Avatar van Crain Nieuw lid Hallo leden, hartstikke bedankt! Ik moet nog lezen, ben blij met jullie reacties.
Ga ik morgenavond rustig lezen en kijken of het alles lukt!

Mijn dank aan jullie is groot!

Craain.

Offline vinTage - 28/01/2014 00:12 (laatste wijziging 28/01/2014 00:13)
Avatar van vinTage Nieuw lid
FangorN schreef:
Deze laatste variant is wellicht iets veiliger, omdat je in de eerste mogelijk (makkelijker) JavaScript kwijt kunt...


Na htmlspecialchars en ent_quotes (heb je ingebouwd in je voorbeeldjes) nog altijd?
Nu word ik benieuwd 
Offline Thomas - 28/01/2014 00:28 (laatste wijziging 28/01/2014 00:30)
Avatar van Thomas Moderator Link kan beginnen met javascript:...

Bijvoorbeeld [ url = javascript:alert(document.cookie)]test[ /url ] werkt.

Als een site JavaScript libraries gebruikt (jQuery) kun je hier vast van alles mee uithalen.

Kan zo gauw niets verzinnen (heb niet echt een mindset voor hacking) maar ik neem aan dat je dit soort praktijken wilt vermijden .
Bedankt door: vinTage
Offline vinTage - 28/01/2014 00:35 (laatste wijziging 28/01/2014 00:45)
Avatar van vinTage Nieuw lid Afaik werken links beginnende met javascript:meuk niet meer in de 'modernere' browsers? (dus al jaren niet meer)

Maar als iemand een alert krijgt op [url=http://javascript:alert(document.cookie)]deze link[/url] horen we het natuurlijk graag 

edit:

fark..wat doe ik fout, of is er een nieuwe controle ingebouwd?

edit, oh er wordt http voorgezet door de parser...nuja, ik test het locaal wel 

edit, ja, dat werkt wel kool 
Offline Thomas - 28/01/2014 00:46
Avatar van Thomas Moderator Mja viel mij ook op .

javascript:void(lala) mag ook overigens.
Offline vinTage - 28/01/2014 01:01
Avatar van vinTage Nieuw lid djeesh, ben nog wat verder aan het freubelen, maar zelfs strip_tags laat 'javascript:blaat' door 

Weer een lesje geleerd vandaag 
Offline Thomas - 28/01/2014 09:43
Avatar van Thomas Moderator @Crain: let er wel op dat je andere input die van UBB-functionaliteit gebruik maakt ook ge-escaped moet worden, tenzij je HTML in je posts wilt toestaan, maar aangezien je [ url=... ] ... [ /url ] gebruikt neem ik aan van niet?

Als je bovenstaande functies inbouwt in andere UBB-functionaliteit, en je had je huiswerk goed gedaan, wordt HTML mogelijk ook op andere plaatsen ge-escaped. Dit moet precies één keer gebeuren per stukje content.

Stel je namelijk het volgende voor:

Iemand plaatst de volgende link:

[ url ] www.test.com/?a=1&b2 [ /url ]

Deze wordt door de bovenstaande functies al herschreven tot:

<a href="www.test.com/?a=1&amp;b=2" target="_blank">www.test.com/?a=1&amp;b=2</a>

En dat is goed.

Maar als de oorspronkelijke inhoud al ge-escaped was, wordt dit:

<a href="www.test.com/?a=1&amp;amp;b=2" target="_blank">www.test.com/?a=1&amp;amp;b=2</a>

en dat breekt je link.

Of als je er helemaal een potje van maakt (je in de verkeerde volgorde escaped):

&lt;a href=&quot; ... naja je snapt me wel.

Dus houd rekening met de volgorde waar je dit inbouwt, en de frequentie waarmee je output escaped.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.232s