Autor Zpráva
Jirin
Profil
Zdravím,
chci umožnit zadávat návštěvník vlastní formátování textu. Takže se nabízí Wysiwyg editor. Nicméně samozřejmě nechci povolit všechny html značky ale jen nějaké základní. Jak to ideálně řešit? Na straně Wysiwyg editoru to nemá mco smysl řešit, protože podstrčit tam může i jinak člověk ten text a musím to ošetřit tedy na straně skriptu.

Nejsnadněji se samozřejmě nabízí použít strip_Tags s povolenými tagy, ale to není úplně ideální, nemám kontrolu nad atributy, může mi tam podstrčit prokliky na javascript apod.

Osobně mě nenanapadlo nic lepšího nez regexpem vyzobat všechny tagy, projet je, zkontrolovat a zbytek zahodit, ale celkem pracné. Není nějaká lepší varianta?
juriad
Profil
$vystup = ''
$zacatky = rozděl vstupní text podle '<'
pro každý prvek $zacatek ze $zacatky:
  $konce = rozděl $zacatek podle '>' s limitem 2
  pokud delka $konce = 1: # neobsahuje koncovou zavorku
    $vystup .= htmlspecialchars('<'.$konce[0]) # vratim '<' zpet
  jinak:
    pokud $konce[0] je některý povolený tag ('b', '/b', 'i', '/i', 'br', ...): # pokud neni, tak se uplne zahodi
      $vystup .= '<'.$konce[0].'>'
    $vystup .= htmlspecialchars($konce[1]) # zbytek jen zajisti, tam už nikde není '<', tedy tam není žádný validní tag
(pseudokód, nevyžaduje regulární výrazy)
Str4wberry
Profil
(Případně existuje jeden hotový nástroj pro zajištění kvalitního výstupu, lze si tam celkem pohodlně nastavit, co je povolené atd.)
Jirin
Profil
Díky za reakce. HTML purifier mi v tomhle případe přijde spíše jako kanon na vrabce. asi pujdou tou cestou jako naznacil juriad, mozna jen do toho nakonec ty regulary nejak zapojim. díky!
Majkl578
Profil
Funkce strip_tags() má 2. parametr „povolené znaky“, otázkou je, zda se na to lze z bezpečnostního hlediska spolehnout (totéž platí pro juriadův kód).
Jirin
Profil
Majkl578:
jj, vim, že strip_tags ma na tohle i whitelist, jsem to ostatně psal v úvodním skriptu, ale nemám pod kontrolou atributy apod.

Juriadův kód beru jako pseudokód a tak to snad ohlídám:)
Str4wberry
Profil
Funkce strip_tags neřeší atributy. Tedy bezpečnostně nevyhovuje. (Ještě neřeší &, ale to je spíš teoretický problém.)

Kód od juriada zahazuje všechny atributy (což se nemusí hodit, pokud mají být nějaké povolené) a nijak nezajišťuje well-formed výstup. Překřižování vem čert, ale uzavřít si třeba o <div> navíc, než je potřeba… Nicméně bezpečnost by to narušovat nemělo.

HTML Purifier sice je kanón na vrabce, ale všechny výše uvedené neduhy řeší. Pokud má uživatel možnost zadávat HTML, tento kanón nám umožní mít kód 100% pod kontrolou. Bez nějakého takového kanónu nelze uživateli, kterému úplně nevěříme, s čistým svědomím nechat vkládat HTML. Dnešní editory sice už omezit značky, omezit atributy a zaručit well-formed umí, ale pořád je tu ten problém s možností zadávat vstup mimo editor.
Jan Tvrdík
Profil
Jirin:
Pokud ti HTML Purifier připadá jako zbytečně velká knihovna, tak můžeš vyzkoušet asi 5× menší Texy!, která je sice primárně na něco úplně jiného, ale tak mimochodem vlastně umožňuje i bezpečně filtrovat HTML tagy a atributy.
Jirin
Profil
Tak jsem zkoušel začít psát a nakonec jsem postupně zjišťoval, že aby to ošetřovalo další a další věci, tak bude nakonec lepší opravdu nasadit htmlpurifier...

texy jsem zvažoval, ale ti co budou to html zadávat jsou v tomhle případu BFUs, takže by mohli být z té jiné syntaxe překvapeni... vím, že jsou i nějaké nadstavby nad tím apod.
Str4wberry
Profil
Reakce na Jana Tvrdíka:
Zběžně jsem na to koukal a mám otázku, třeba budeš vědět, než se do Texy! podívám důkladněji.

Zdá se, že povolené HTML značky a atributy lze poměrně snadno určit:
$texy->allowedTags =
    array(            // enable only tags <myExtraTag> with attribute & <strong>
        'myExtraTag' => array('attr1'),
        'strong'     => array(),
    );

Dá se nějak stanovit, co se s neznámými elementy má dělat? HTML Purifier je vyhodí, Texy! vyhazuje jen nepovolené atributy, ale nepovolené značky považuje za běžný text a vypíše je. Jinak se zdá, že by to mohlo jít místo HTML Purifieru použít.


Reakce na Jirina:
texy jsem zvažoval, ale ti co budou to html zadávat jsou v tomhle případu BFUs, takže by mohli být z té jiné syntaxe překvapeni... vím, že jsou i nějaké nadstavby nad tím apod.
Jak psal Jan Tvrdík, Texy! lze použít i k opravě HTML. Tedy by neměl být problém výstup z WYSIWYG editoru prohnat ještě přes Texy!.
Jan Tvrdík
Profil
Str4wberry:
Dá se nějak stanovit, co se s neznámými elementy má dělat?
Myslím, že ne. Souvisí to s tím, že tohle není primární účel Texy.

Jinak ještě je potřeba zakázat všechny syntaxe kromě HTML tagů:
$texy->allowed = array('html/tag' => true);
$texy->setOutputMode(Texy::HTML5);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: