Как предотвратить использование тега img html в других тегах html - wordpress - PullRequest
0 голосов
/ 22 февраля 2020

Извините за мою плохую грамматику, Engli sh не является моим основным языком:)

Я разрабатываю полностью ajax основанную на внешнем интерфейсе тему WordPress на основе комментариев пользователей, и я хотел добавить богатый текстовый редактор (Froala). И как мы все это знаем; это приносит много проблем с безопасностью.

Я не хочу использовать HTML Библиотека очистителя, это слишком тяжело.

Я думаю, я нашел хороший способ дезинфицировать все мои данные отправлено пользователями, но я застрял.

Мое мнение о дезинфекции ->

В форме отправки -> получить все данные HTML и преобразовать их в bbcode, как в стиле javascript.

var htmlToBBCode = function(html) {
...
    html = html.replace(/<a(.*?)href="(.*?)"(.*?)>(.*?)<\/a>/gi, "[url url=$2 kelime=$4]");
    html = html.replace(/<textarea(.*?)>(.*?)<\/textarea>/gmi, "\[code]$2\[\/code]");
    html = html.replace(/<b>/gi, "[b]");
    html = html.replace(/<\/b>/gi, "[/b]");
    html = html.replace(/<img(.*?)width="(.*?)"(.*?)height="(.*?)"(.*?)src="(.*?)"(.*?)>/gi, "[img weight=$2 height=$4 src=$6]");
...
}
  let editor = new FroalaEditor('#entry_html_input', {}, function () {
  });
  var bbcode = htmlToBBCode(editor.html.get());

На стороне сервера -> sanitize_text_field() all $_POST["comment"] (так что я могу защитить от ppl, который отправил грязный код xss через консоль - ajax)

$clean_comment  = sanitize_textarea_field(nl2br(wp_unslash($_POST["comment"]))); 

На сервере side -> Используйте функцию add_shortcode () для wordpress.

  function img_shortcode($atts, $content)
{
    $weight = intval($atts["weight"]);
    $height = intval($atts["height"]);
    $src = esc_url($atts["src"])
    $return = '<center><img src="' . $src . '" width="'.$weight.'" height="'.$height.'" rel="nofollow"/></center>';
    return $return;
}

add_shortcode('img', 'img_shortcode');

function b_shortcode($atts, $content)
{
    $bold_text = sanitize_text_field($content);
    return '<b>'.$bold_text.'</b>';
}

add_shortcode('b', 'b_shortcode');

И все работает отлично! Поправьте, если я ошибаюсь, это абсолютно безопасный способ против XSS. Я знаю, что все параметры переданы в шорткод, и я знаю, как с ними обращаться. Если они обойдут конвертер bbcode, существует sanitize_text_field (); когда пришло $ _POST.

Но вот где я застрял ...

Когда редактор отправляет HTML вот так:

<p>
<strong>
sdfsfsdfsfd
<img src="https://i.ibb.co/9bxPvhM/86a9d5b8bc498dc5eb3689f0b983a5a7a3f1c1bb.jpg" style="width: 300px;" class="fr-fic fr-dib">
qwrrwqqrwqwrrqw
</strong>
</p>

Да, bbconverter пытается на это:

[b]
&nbsp;sdfsfsdfsfd&nbsp;
[img]
https:/i.ibb.co/9bxPvhM/86a9d5b8bc498dc5eb3689f0b983a5a7a3f1c1bb.jpg
[/img]
&nbsp;qwrrwqqrwqwrrqw
[/b]

и sanitize_text_field(); внутри функции b_shortcode принудительно убивают-удаляют изображение ...

Это всего лишь простой пример. Как вы можете себе представить, это происходит и с тегами "i","sub","sup".

Я пробовал подобные решения:

  html = html.replace(/<strong>(.*?)<img(.*?)src="(.*?)"(.*?)style="(.*?)"(.*?)>(.*?)<\/strong>/gi, "[bold_image_mixed text_before=$1 text_after=$7 img_url=$3 img_width=$5]");

И да, это работает. Но есть так много тегов и комбинаций, которые могут сломать мое изображение или мое видео на YouTube (iframe) с этими тегами.

Как я могу предотвратить это? Что вы думаете о моем способе очистки html ввода?

Я надеюсь, что кто-нибудь может мне помочь ...

1 Ответ

0 голосов
/ 22 февраля 2020

Бог! Я только что понял!

    function b_shortcode($atts, $content)
{
    $bold_text = sanitize_text_field($content);
    return '<b>'.$bold_text.'</b>';
}

add_shortcode('b', 'b_shortcode');

Если я изменю это, на это ->

  function b_shortcode($atts, $content)
{
    $bold_text = sanitize_text_field($content);
    return '<b>'.do_shortcode($bold_text).'</b>';
}

add_shortcode('b', 'b_shortcode');

Так что, если я добавлю do_shortcode () к $ bold_text; он применяет другие функции шорткода к этой строке. Если нет других значений шорткода, совпадения; он возвращает простой текст!

Но мой другой вопрос все еще не решен ...

Это безопасный способ остановить XSS?

...