HTMLPurifier не удаляет тег сценария

Я много пробовал и устал сейчас. Итак, вы хотите знать, почему этот код (HtmlPurifier) не удаляет тег скрипта.

Это мой контроллер opencart 2.1.0.2-›register.php

        $custmer_data = $this->request->post; // get all post-data
        ///////////////// html purifier ////////////
        $log_file_name = "Reg_LOGs.log";
        $logger = new Log($log_file_name); //just passed the file name as file_name.log
        $logger->write($custmer_data);
        $logger->write($custmer_data['firstname']);
        $logger->write($custmer_data['lastname']);
      if(@require_once('htmlpurifier/library/HTMLPurifier.auto.php'))
      {
        $config = HTMLPurifier_Config::createDefault();
        $config->set('Core.Encoding', 'UTF-8');
        $config->set('Core.AggressivelyRemoveScript', true);
        $allowedElements = [
        'p[style]',
        'br',
        'b',
        'strong',
        'i',
        'em',
        's',
        'u',
        'ul',
        'ol',
        'li',
        'span[class|data-custom-id|contenteditable]',
        'table[border|cellpadding|cellspacing]',
        'tbody',
        'tr',
        'td[valign]',
    ];

    $config->set('HTML.Allowed', implode(',', $allowedElements));

    $def = $config->getHTMLDefinition(true);
    $def->addAttribute('span', 'data-custom-id', 'Text');
    $def->addAttribute('span', 'contenteditable', 'Text');
        $purifier = new HTMLPurifier($config);
        $test_f = $purifier->purify($custmer_data['firstname']);
        $test_l = $purifier->purify($custmer_data['lastname']);
        $logger->write($test_f);
        $logger->write($test_l);
      }
        ///////////////// html purifier ends ////////////

Я ввожу значения для имени и фамилии, например:

имя : <input type="text" name="firstname" value="<a onclick=&quot;script:al&quot;>L</a>" placeholder="First Name" id="input-firstname" class="form-control">

фамилия : <input type="text" name="lastname" value="<a href=&quot;javascript:alert('Hello Stack Overflow')&quot; onclick=&quot;javascript:alert('onclick')&quot;>Link with javascript</a>" placeholder="Last Name" id="input-lastname" class="form-control">

Перед применением HTMLPurifier вывод будет таким:

$logger-›write($custmer_data['имя']); записывается как 2020-07-23 8:36:33 - &lt;a onclick=&quot;script:al&quot;&gt;L&lt;/a&gt; и

$logger-›write($custmer_data['lastname']); записывается как 2020-07-23 8:36:33 - &lt;a href=&quot;javascript:alert('Hello Stack Overflow')&quot; onclick=&quot;javascript:alert('onclick')&quot;&gt;Link with javascript&lt;/a&gt;

После применения HTMLPurifier результат будет таким:

$logger-›write($custmer_data['имя']); записывается как 2020-07-23 8:36:33 - &lt;a onclick="script:al"&gt;L&lt;/a&gt; и

$logger-›write($custmer_data['lastname']); записывается как 2020-07-23 8:36:33 - &lt;a href="javascript:alert('Hello Stack Overflow')" onclick="javascript:alert('onclick')"&gt;Link with javascript&lt;/a&gt;

Так что тег script вообще не удаляется.

Пожалуйста, помогите мне в этом.

библиотека, которую я использую: http://htmlpurifier.org/


person gopal sharma    schedule 23.07.2020    source источник


Ответы (1)


Почему HTML Purifier делает то, что вы наблюдаете?

У меня хорошие новости: проблема, которую вы наблюдаете, на самом деле заключается в том, что отсутствует тег скрипта.

Чтобы взять зарегистрированное значение firstname в качестве примера, &lt;a onclick=&quot;script:al&quot;&gt;L&lt;/a&gt; — это прекрасно экранированный HTML, который совершенно безвреден, если вы поместите его на HTML-страницу — он визуально отображается для конечного пользователя как текст :

<a onclick="script:al">L</a>

Он не отображается как ссылка в контексте HTML, если вы не выполните echo html_entity_decode($value). Без html_entity_decode() это безвредно, и HTML Purifier знает об этом. У него нет причин анализировать кодированный HTML; семантически это просто текст.

Когда следует использовать HTML Purifier?

Однако, поскольку вы используете очиститель HTML для таких полей, как имя и фамилия, я подозреваю, что на самом деле вы не хотите использовать очиститель HTML, хотя вы можете этого не осознавать.

HTML Purifier предназначен для безопасного некоторого HTML, и его следует использовать при выводе ваших данных в HTML-контекст:

// example:
echo $purifier->purify(html_entity_decode($custmer_data['firstname']));
// '--> outputs `<a>L</a>`

Но это также означает, что если вы не заинтересованы в сохранении какого-либо HTML-кода из вашего ввода (вы, вероятно, не хотите позволять людям использовать форматирование HTML при первом и последнем имена), HTML Purifier не подходит для этой работы. Вам следует использовать htmlspecialchars(). (Это тоже то, что вы должны делать при выводе данных на веб-страницу. С другой стороны, когда вы сохраняете значения в своей базе данных, вы захотите использовать подготовленные операторы или что-то в этом роде. например mysqli_real_escape_string().)

В общем, как намерение, так и контекст имеют решающее значение при выборе способа экранирования или очистки данных. Подумайте, куда вы помещаете данные и что что вы хотите разрешить или запретить.

person pinkgothic    schedule 24.07.2020
comment
Прежде всего, спасибо за ответ @pinkgothic. Пожалуйста, убедитесь, что перед использованием библиотеки HTMLPurify результат в порядке, но я хочу удалить все теги, кроме разрешенных html-тегов (скрипт-тег также не установлен в разрешающих тегах) в массиве $allowedElements, поэтому я хочу использовать библиотеку HTMLPurifier, потому что она принимает сразу все $_GET, $_POST, $_REQUEST, фильтрует их и возвращает требуемый результат. Я не хочу фильтровать поля формы одно за другим или не использовать цикл! Итак, наконец, HTMLPurifier не удаляет тег script и/или любой встроенный скрипт, который может быть вредным. - person gopal sharma; 26.07.2020
comment
@gopalsharma Вы должны понимать, что &lt;a onclick=...&gt; не то же самое, что <a onclick=...>. HTML Purifier абсолютно справится со вторым случаем. На первое плевать, да и не должно - в этом нет ничего вредного. Тем не менее, как я объяснил, пожалуйста, пересмотрите свой вариант использования, потому что HTML Purifier не похож на правильный инструмент для того, чего вы пытаетесь достичь. - person pinkgothic; 27.07.2020