Autor | Zpráva | ||
---|---|---|---|
Jirin Profil |
#1 · Zasláno: 15. 5. 2013, 15:43:24
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 |
||
Str4wberry Profil |
#3 · Zasláno: 15. 5. 2013, 16:36:55
(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 |
#5 · Zasláno: 15. 5. 2013, 22:04:21
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 |
#6 · Zasláno: 16. 5. 2013, 13:11:12
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 |
#7 · Zasláno: 16. 5. 2013, 13:41:38
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 |
#8 · Zasláno: 16. 5. 2013, 13:49:03
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 |
#9 · Zasláno: 16. 5. 2013, 14:34:48
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 |
#10 · Zasláno: 16. 5. 2013, 14:39:41
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 |
#11 · Zasláno: 16. 5. 2013, 15:36:59
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); |
||
Časová prodleva: 11 let
|
0