HTML – kontrola vstupu

Při psaní webových aplikací člověk narazí na nutnost umožnit uživateli zadat text pomocí WYSIWYG HTML editorů (jako jen napřílkad FCKEditor). V tu chvíli se každý rozumný programátor začne obávat nejen o bezpečnost, ale i o vizuální podobu stránky (uživatel použije zelené písmo na žlutém pozadí či zkopírování textu přes schránku z wordu). Nevyhneme se tak nutnosti kontroly uživatelem zadaného HTML a odstranění nepovolených HTML značek, atributů a entit a inline kaskádových stylů.

Na stejný problém jsme samozřejmě narazili i my při psaní nového modulu komunit do portálu EDU.cz.

Chtěl bych se s vámi podělit o způsob, jakým jsme tento problém vyřešili my.

Celý proces kontroly lze rozdělit na několik částí:

  • oprava HTML kódu (doplnění chybějících značek)
  • kontrola a případné odstranění nepovolených značek

Pro opravu HTML kódu používáme knihovnu NekoHTML:

String text = "<strong>ahoj";
DOMFragmentParser parser = new DOMFragmentParser();
HTMLDocument htmlDocument = new HTMLDocumentImpl();
DocumentFragment fragment = htmlDocument.createDocumentFragment();
StringWriter sw = new StringWriter(); 

// zde je důležitá definice filtrů, které se mají na HTML aplikovat
XMLDocumentFilter[] filters = { new Purifier(), new Writer(sw, "utf-8") };
		
parser.setProperty("http://cyberneko.org/html/properties/filters", filters);
parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");

InputSource is = new InputSource(new StringReader(text));
parser.parse(is, fragment);		
System.out.println(sw.toString());

Výsledkem tedy bude „<strong>ahoj</strong>.

Dále je nutné zkontrolovat povolené značky – použili jsme knihovnu AntiSamy. Jedná se o snadno použitelnou knihovnu, která na základě konfiguračního souboru dokáže HTML kód zkontrolovat:

Policy policy = new Policy(POLICY_FILE_LOCATION);
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(dirtyInput, policy);
System.out.println(cr.getCleanHTML());

Konfigurační soubor umožňuje definovat povolené tagy, atributy a použité kaskádové styly. Protože vytvořit takovýto soubor je poměrně náročné, existuje sada již existujících, které je možné použít. Jmenují se slashdot, ebay, myspace a snaží se chovat stejně jako filtry použité na uvedených stránkách. Můžete je použít přímo a nebo si je dále upravit pro svoje potřeby.

Poznámka: Pokud přemýšlíte nad názvem projektu AntiSamy, tak vězte, že Samy se jmenoval slavný XSS virus napadající MySpaces.

Díky těmto jednoduchým knihovnám lze velmi snadno bránit útokům na vaše stránky a současně umožnit uživatelům zadávat HTML značky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *