Čištění HTML z WYSIWYG editoru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jannek19
Člen | 47
+
0
-

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:

  1. 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
  2. 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.

iGavrilo
Člen | 32
+
0
-

Osobne si myslím že pred uložením. Načo zaťažovať DB niečim čo tam v skutočnosti mať nechceš !?

MirekTH
Člen | 20
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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á:

  1. 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)
  2. 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).