Извините за мою плохую грамматику, 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]
sdfsfsdfsfd
[img]
https:/i.ibb.co/9bxPvhM/86a9d5b8bc498dc5eb3689f0b983a5a7a3f1c1bb.jpg
[/img]
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 ввода?
Я надеюсь, что кто-нибудь может мне помочь ...