Portál AbcLinuxu, 8. května 2025 18:09

Dotaz: php jak escapovat url pre A element

20.1.2014 11:51 gsnak | skóre: 22 | blog: gsnak
php jak escapovat url pre A element
Přečteno: 214×
Odpovědět | Admin

Vypisujem cez PHP na stranke adresu, URL je moja (natvrdo v zdrojaku), a pouzivatel zada len text ktory bude na tuto adresu odkazovat. Bezpecne sa to escapuje takto (vystupom je html):

echo '<a href="http://example.com/123">'.htmlspecialchars($_REQUEST['nazov']).'</a>';

Co ak ale chcem aby pouzivatel zadal aj URL? Je toto bezpecne?

echo '<a href="'.htmlspecialchars($_REQUEST['url']).'">'.htmlspecialchars($_REQUEST['nazov']).'</a>';

Je mozne pouzit tu istu funkciu na escapovanie htmlspecialchars? Alebo tym ze je to v href="__tu__" musim pouzit ineco ine? Co?

Pozn: Realne tam este mam obmedzenie max. dlzky na 1000, htmlspecialchars(substr($_REQUEST['nazov'] ,0,1000)), vynechal som to lebo to s escapovanim priamo nesuvisi.

Čo Rys, to vrah!
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

AraxoN avatar 20.1.2014 12:35 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak užívateľ zadal celú URL, tak áno, escapovať cez htmlspecialchars(), pretože predpokladá sa, že používateľ vložil už správne naformátovanú URL a treba ošetriť len znaky, ktoré môžu byť konfliktné v HTML (v praxi len znak &). Ak by zadával len časť URL (napr. http://www.example.com/data/<používateľská časť>, potom je bezpečné predpokladať, že je potrebné použiť aj urlencode() na tú časť, ktorú zadal.
20.1.2014 12:48 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
a ak zadal celu url nie je urlencode treba?
Čo Rys, to vrah!
AraxoN avatar 20.1.2014 14:00 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
Nie, lebo to zaenkóduje aj také časti, ktoré nemajú byť kódované. Keby si chcel celú URL dať ako parameter do inej URL, potom áno:

http://www.example.com/?redirect_to=<?php echo urlencode($url); ?>
20.1.2014 14:17 gsnak | skóre: 22 | blog: gsnak
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element

Cize spravne je to takto?

echo '<a href="'.urlencode($vstup1).'">'.htmlspecialchars($vstup2)).'</a>';
Čo Rys, to vrah!
AraxoN avatar 20.1.2014 15:07 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
Nie, nie je to univerzálne. Podľa toho, čo je $vstup1 a čo je $vstup2. Cez urlencode() sa kódujú len niektoré časti URL. htmlspecialchars() zase slúži na vypísanie znakov v HTML a s URL to v podstate nesúvisí. Najlepšie by bolo preštudovať manuál ku týmto dvom funkciám, plus príslušné RFC, ktoré sa zaoberajú URL adresami (v googli hľadať "url rfc") - to je obzvlášť nudné čítanie, ale obávam sa, že to je jediný spôsob ako poňať celú šírku problému.

Alebo sa na to vykašli a neenkóduj nič, kým to funguje. To je síce zneužiteľná chyba, ale v praxi nie príliš často.
Jendа avatar 20.1.2014 21:48 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
To je síce zneužiteľná chyba, ale v praxi nie príliš často.
Jde tam strčit JavaScript a přečíst si pomocí něj cookie (pokud nemá nějaký flag?) nebo dělat jiné podobné skopičiny (protože ten JS má nastavené takové to origin policy a tak může číst třeba DOM stránky včetně anti-CSRF tokenů), ne?
Josef Kufner avatar 20.1.2014 21:37 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
Toto je špatně. urlencode slouží k escapování parametrů v URL, nikoliv k escapování HTML.
Hello world ! Segmentation fault (core dumped)
Josef Kufner avatar 20.1.2014 21:51 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: php jak escapovat url pre A element
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud používáš UTF-8, PHP 5.4, HTML 4.01 a okolo hodnoty atributu máš uvozovky, stačí použít prosté htmlspecialchars, tedy přesně tak, jak to máš.

Doporučuju používát namísto toho tuto funkci:
function html($str) {
  return htmlspecialchars($str, ENT_COMPAT | ENT_HTML5, 'UTF-8', true);
}
Samozřejmě nahraď ENT_HTML5 a kódování podle toho, co používáš.

A pak:
echo '',
  html($_REQUEST['nazov']), '';
Pak ale není dobré jen tak rovnou použít vstup uživatele bez dalšího ověřování. Co by se stalo, když by někdo vyrobil ošklivý odkaz a poslal ho své oběti? To je však specifické pro každou aplikaci a pokaždé je vhodné to řešit trošku jinak. Rozhodně je však vhodné se nad tím zamyslet.

Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.