1<?php 2/** 3 * webtrees: online genealogy 4 * Copyright (C) 2019 webtrees development team 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 15 */ 16declare(strict_types=1); 17 18namespace Fisharebest\Webtrees\Services; 19 20use HTMLPurifier; 21use HTMLPurifier_AttrDef_Enum; 22use HTMLPurifier_Config; 23 24/** 25 * Filter/sanitize HTML 26 */ 27class HtmlService 28{ 29 /** 30 * Take some dirty HTML (as provided by the user), and clean it before 31 * we save/display it. 32 * 33 * @param string $html 34 * 35 * @return string 36 */ 37 public function sanitize(string $html): string 38 { 39 $config = HTMLPurifier_Config::createDefault(); 40 41 $config->set('HTML.TidyLevel', 'none'); // Only XSS cleaning now 42 43 $def = $config->getHTMLDefinition(true); 44 45 // Allow image maps 46 $def->addAttribute('img', 'usemap', 'CDATA'); 47 48 $map = $def->addElement('map', 'Block', 'Flow', 'Common', [ 49 'name' => 'CDATA', 50 'id' => 'ID', 51 'title' => 'CDATA', 52 ]); 53 54 $map->excludes = ['map' => true]; 55 56 $area = $def->addElement('area', 'Block', 'Empty', 'Common', [ 57 'name' => 'CDATA', 58 'id' => 'ID', 59 'alt' => 'Text', 60 'coords' => 'CDATA', 61 'accesskey' => 'Character', 62 'nohref' => new HTMLPurifier_AttrDef_Enum(['nohref']), 63 'href' => 'URI', 64 'shape' => new HTMLPurifier_AttrDef_Enum(['rect', 'circle', 'poly', 'default']), 65 'tabindex' => 'Number', 66 'target' => new HTMLPurifier_AttrDef_Enum(['_blank', '_self', '_target', '_top']), 67 ]); 68 69 $area->excludes = ['area' => true]; 70 71 $purifier = new HTMLPurifier($config); 72 73 return $purifier->purify($html); 74 } 75} 76