Čištění HTML z WYSIWYG editoru
- jannek19
- Člen | 47
Ahoj, mám dotaz.
Mám na webu WYSIWYG editor (TinyMCE), potřebuju výstup z něj před uložením do DB vyčistit. Chtěl bych znát názor zkušenějších – jaký nástroj na to použít. V zásadě uvažuji o 2 možnostech:
- Texy – na projektu už Texy používám, Texy IMHO poměrně dobře znám, pokud se povypínají ostatní moduly, šlo by to použít i pro čištění kódu
- HTML Purifier – s ním jsem zatím nepracoval, četl jsem, že to je poměrně schopný nástroj
Zatím u mě vyhrává Texy, ale je to dobrá volba? A je vhodné čistit HTML před uložením do DB, nebo až při načtení?
Předem díky.
- MirekTH
- Člen | 20
Použil bych asi specializovaný nástroj, tedy HTML Purifier. Texy sice nepoužívám, ale na čištění kódu dělané myslím není. Čistil bych před uložením, pokud by ses potřeboval někdy v budoucnu vrtátit k originálu tak ukládej oboje (budeš mít výhozí bod ke kompletnímu přegenerování, třeba pokud bys potřeboval povolit nějaké další značky atd … ). Ale u výstupu z WYSIWYGu to asi potřeba není.
- David Matějka
- Moderator | 6445
Kdyz to udelas pred ulozenim do db, tak nebudes mit moznost upravit pravidla sanitizace. Kdyz by se to resilo az na vystupu, tak muzes zprisnit/uvolnit pravidla.
Ta sanitizace (a v pripade texy i nejaka transformace) je „destruktivni“ a uzivatel pri editaci neuvidi to, co zapsal. Ale tohle by v tomhle pripade, kde se sanitizuje vystup wysiwyg (a tedy html), tolik vadit nemuselo.
- MirekTH
- Člen | 20
Jinak pro jednoduché vyčištění stačí použít toto (po instalaci composerem, samozřejmě):
$config = \HTMLPurifier_Config::createDefault();
$purifier = new \HTMLPurifier($config);
$safeHtml = $purifier->purify($html);
Tohle provede jednoduché čištění, zabrání vkládání scriptů, onclicků apod. Pokud bys potřeboval donastavit tak se nastavuje config, například:
$config->set('HTML.ForbiddenElements', 'a');
zakáže všechny odkazy. Nastavení je spousty, stačí mrknout do dokumentace.
- MirekTH
- Člen | 20
David Matějka napsal(a):
Kdyz to udelas pred ulozenim do db, tak nebudes mit moznost upravit pravidla sanitizace. Kdyz by se to resilo az na vystupu, tak muzes zprisnit/uvolnit pravidla.
Vždy záleží na použítí. Pro osobní blog, který má malou návštěvnost bych se nebál provést sanitizaci na výstupu. U větších projektů už může opakovaná sanitizace stát nemalé prostředky a je lepší servírovat už upravenou verzi z DB.
- jannek19
- Člen | 47
Díky za rady.
Když tak nad tím přemýšlím, asi bude nejlepší použít HTML Purifier. A když jsem si přečetl vaše poznámky o tom, zda čištění provést před, nebo po uložení, došel jsem k tomu, že vůbec nejideálnější by bylo čistit jak před uložením, tak před zobrazením :) Představa je asi taková:
- provést základní čištění před uložením do DB (nastavení povolených tagů by mělo korespondovat s nastavením WYSIWYG editoru – např. u TinyMCE je možné vyjmenovat validní tagy, vše ostatní by měl před odesláním odstranit, na to se ale nedá spoléhat, takže provedeme čištění i na serveru)
- provést čištění před zobrazením – pro případ, že by došlo ke změně/zpřísnění pravidel, tento výstup asi ideálně kešovat
Vlastně by to nemělo být ani moc pracné – obě čištění by mohla zajišťovat stejná služba – jen by se volala z různých míst (před uložením a před zobrazením).