Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 25.08.2019
Сообщений: 42

Запрет ввода script тега и его содержимого пользователем в contenteditable

12.02.2021, 21:49. Показов 2368. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, передо мной стоит задача:
В целях обеспечения безопасности запретить ввод, либо удалять из текста теги script и все его содержимое перед сохранением в бд.
В приоритете, конечно же, именно запрет на ввод данной конструкции.
В моей голове есть только варик с выдиранием и то не полным (т.е. только сами теги).
Что посоветуете студенту 4 курса, у которого никогда в колледже не было пар по web-программированию?
Заранее спасибо всем откликнувшимся. Очень выручаете.

З.Ы.:
Если кому-то нужен пример конструкции поля ввода, то вот:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    <form method="post" action="" enctype="multipart/form-data">
                    
    <div class="content-input" name="text_block" id="text" value placeholder="Что нового?" contenteditable></div>
        <textarea name="text2" id="text2" cols="30" rows="10" class="hidden" value placeholder="Что нового?"></textarea>
        <input type="text" id="htags" class="htag-input" pattern = '[\x1F-\xBF]*' placeholder="Хештеги (только латинские символы)">
        <div id="htag_view" class="htag-view view"></div>
        <input type="text" name="htag_view_input" id="htag_view_input" class="hidden">
        <input type="text" name="YTembed" id="YTembed_place" class="hidden">
        <div class="BTNScontainer">
            <div class="input-file_btn">
                <label>
                    <input name="upl_file" multiple="true" id="upl" type="file" onchange="getFileName();" class="input-file" accept="image/*">
                    <div id="filename">Файл</div>
                </label>
            </div>
            <input type="submit" name="send_post" class="sends" onclick="SendPost();" value="Отправить">
        </div>
    </form>
Добавлено через 2 часа 45 минут
UPD: и снова я поспешил с созданием темы (но, может кому пригодится из новичков).
PHP
1
$filtered_var = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $var);
Нашел решение на stackoverflow.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2021, 21:49
Ответы с готовыми решениями:

Смогу ли я получить доступ к переменной данного тега из другого тега script?
если я в одном теге script объявлю переменную с именем mymap,то смогу ли я получить доступ к этой переменной из другого тега script. ...

Нахождение содержимого тега A, без тега а и параметров
Здравствуйте. Не могу решить вот такую задачку: Есть ссылки следующего вида: &lt;a...

Закрытие тега script
Почему вот так всё ок и на странице скрипты буду работать как из файла cookie так и те что явно вписаны далее (конкретно функция resize...

7
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.02.2021, 22:46
Цитата Сообщение от NightWolfPS Посмотреть сообщение
снова я поспешил с созданием темы (но, может кому пригодится из новичков).
Могу расстроить, ты опять поспешил
PHP
1
2
3
$var = '<div>Good</div><scr<script></script>ipt>alert("Not Good")</scr<script></script>ipt>';
$filtered_var = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $var);
echo $filtered_var;
Прежде чем продолжишь искать решение, ответь на вопрос - Зачем удалять теги скрипт? Например, если б данный форум так поступал, то ты бы не смог нормально задать этот вопрос. Надо вставить строку в html - есть шаблонизаторы, ну или на крайний случай <?= htmlentities($raw_string, ENT_COMPAT , 'UTF-8') ?>. Если уж и удалять что-то, то делать это нормально, обрабатывать этот фрагмент не как строку, не костылить текущее "решение", загоняя его в цикл, а работать с html документом. Ведь помимо несчастного <script> можно, например, просто верстку сломать, добавив некорректный html. И скорее всего уже есть всякие готовые htmlpurifierы, которые возможно и делают что нужно.
0
0 / 0 / 0
Регистрация: 25.08.2019
Сообщений: 42
12.02.2021, 22:54  [ТС]
Jewbacabra, Увы, но это я тебя расстрою. Возможно, это и костыль, но как временная заплатка против XSS самое то. Прикол не в устранении script из самого документа, а в предотвращении нежелательного внедрения вредоносного кода пользователем. Теперь понятней? И в цикл ничего загонять не нужно.
И поломанная верстка, поверь, это полбеды в сравнении с утечкой личных данных пользователей.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
12.02.2021, 22:58
PS. И тег скрипт - не единственный способ добавить js код. Еще можно придумать всякие штуки типа <img src="http://bar.url" onerror="alert('hacked')". Возможно есть и еще варианты.

Добавлено через 2 минуты
Цитата Сообщение от NightWolfPS Посмотреть сообщение
Увы, но это я тебя расстрою
Нет, это я тебя расстрою. Никакая это не заплатка, это самый обычный говнокод. И никому из новичков ни в коем случае нельзя его использовать.
Цитата Сообщение от NightWolfPS Посмотреть сообщение
Прикол не в устранении script из самого документа, а в предотвращении нежелательного внедрения вредоносного кода пользователем. Теперь понятней?
Я продемонстрировал простой пример как твою "защиту" обойти и предложил действительно хорошее решение, подходящее в большинстве случаев.
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
14.02.2021, 00:00
В итоге и я расстроился.
Цитата Сообщение от NightWolfPS Посмотреть сообщение
$filtered_var = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $var);
PHP
1
$var = "<div onload=\"alert('hacked');\"></div>"
Добавлено через 9 минут
Цитата Сообщение от Jewbacabra Посмотреть сообщение
можно, например, просто верстку сломать, добавив некорректный html.
Точнее, некорректный XML.
Я обычно для избежания этого проверяю корректность XML перед тем, как что-то дальше делать с поступившими данными.
Цитата Сообщение от NightWolfPS Посмотреть сообщение
В целях обеспечения безопасности
следует (см. выше). Кроме того, следует пропускать только строго разрешенные, заведомо безопасные последовательности символов/строк. Остальное, по-моему, от лукаваго.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.02.2021, 00:22
Цитата Сообщение от Htext Посмотреть сообщение
Точнее, некорректный XML.
html. Например, вот абсолютно корректный html <div><p>I am correct html</div>, но с точки зрения xml это неверно.
Цитата Сообщение от Htext Посмотреть сообщение
Кроме того, следует пропускать только строго разрешенные, заведомо безопасные последовательности символов/строк. Остальное, по-моему, от лукаваго.
Строка <script>/* ... */</script> безопасна? На мой взгляд да, и мне бы не понравилось, если б форум решил иначе и вырезал её. 95% случаев решаются так
Цитата Сообщение от Jewbacabra Посмотреть сообщение
<?= htmlentities($raw_string, ENT_QUOTES, 'UTF-8') ?>
Или что лучше - шаблонизатором, который это сам сделает

Добавлено через 10 минут
Не ENT_COMPAT , а ENT_QUOTES естественно, в сообщении выше поменять уже не могу
0
365 / 124 / 22
Регистрация: 08.01.2015
Сообщений: 1,418
Записей в блоге: 2
14.02.2021, 00:45
Цитата Сообщение от Jewbacabra Посмотреть сообщение
абсолютно корректный html <div><p>I am correct html</div>
Ну, вот такое лучше бы не пропускать. Или уж принудительно закрывать </p> хотя бы. На мой взгляд, эти нововведения от html5 до добра не доведут.
А если еще встретится что-то типа
&&lt; - то уже на стороне РНР может быть проблема.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Строка <script>/* ... */</script> безопасна?
Сомневаюсь. А если нечто типа
HTML5
1
<script>/* ...*/alert('hacked');/*... */</script>
Самое безопасное - это строго оговоренный белый список.

Добавлено через 3 минуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
htmlentities
Помимо этого, я, на всякий случай, еще preg_replace И ВДОБАВОК ereg_replace использую. 3 этапа. Для подстраховки. Если вдруг в одной из функций уязвимость обнаружится.

Добавлено через 1 минуту
А где-то ВДОБАВОК к этому - еще и str_replace (для подстраховки htmlentities).
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.02.2021, 02:21
Цитата Сообщение от Htext Посмотреть сообщение
А где-то ВДОБАВОК к этому - еще и str_replace (для подстраховки htmlentities).
Не надо никаких подстраховок. htmlentities как раз и превращает сырые данные в строку. Нет вообще никаких "опасных" строк.
Цитата Сообщение от Htext Посмотреть сообщение
<script>/* ...*/alert('hacked');/*... */</script>
Ты же ее написал, и с форумом ничего не случилось 100% безопасно.
Цитата Сообщение от Htext Посмотреть сообщение
На мой взгляд, эти нововведения от html5 до добра не доведут.
По-моему это и до html 5 было. Но это далеко не единственное, что еще отличает от xml

Добавлено через 2 минуты
PHP
1
2
3
$raw = '<script>alert("Hacked")</script>';
//echo 'Плохо '.$raw;
echo 'Хорошо '.htmlentities($raw, ENT_QUOTES, 'UTF-8');
Хорошо &lt;script&gt;alert(&quot;Hacked&quot;)&lt;/script&gt;

PS
Цитата Сообщение от Htext Посмотреть сообщение
ereg_replace
Лучше php обновить

Добавлено через 1 час 6 минут
PPS. Стоит еще добавить про валидацию данных. Валидация никак не связана с подстановкой данных. Сама по себе валидация нужна, чтобы запросы с заведомо некорректными данными заворачивать, но провалидированные данные не значит, что это данные, готовые к подстановке, поэтому их тоже нужно экранировать.

И про некоторые 5% случаев тоже стоит сказать, а именно подстановка аттрибутов. Если коротко - не подставляйте аттрибуты
Цитата Сообщение от Jewbacabra Посмотреть сообщение
<img src="http://bar.url" onerror="alert('hacked')"
PHP
1
echo htmlentities('<img src="http://bar.url" onerror="alert(\'hacked\')">', ENT_QUOTES, 'UTF-8');
Пока все хорошо, htmlentities выполняет свою работу - делает строки. Но если вдруг зачем-то мне захочется сделать такую гадость
PHP
1
<img src="http://bar.url" onerror="<?= htmlentities($_GET['xss'], ENT_QUOTES, 'UTF-8') ?>">
то значение аттрибута это и так строка, и хоть что угодно делай, все равно не поможет. Но представить тяжело, что такое вообще потребуется.
Теперь более реалистичный сценарий - подстановка href. Тут проблема в том, что не только ссылка может начинаться наdata: или javascript:, но и вполне приличная с виду ссылка, например https://nesberbank.ru, которая ведёт на фишинговый сайт. В некоторых случаях можно будет делать, например, так <a href="https://www.cyberforum.ru/php-beginners//<?= htmlentities(...) ?>"> (offtop: тут форум коверкал ссылку, какая ирония, пришлось снять выделение), т.е используя префикс, тем самым избегать javascript: или внешних ссылок. Если ссылка должна быть внешней, то parse_url поможет с валидацией. Но если эта ссылка от непроверенного пользователя, и нет никаких ограничений по возможным доменам, то только проверка человеком, или возможно есть какие сервисы для этого. Поэтому возможно стоит отказаться от ссылок "куда угодно от кого угодно". Наличие ссылок на вредоносные сайта конечно не уязвимость, но все равно не приятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2021, 02:21
Помогаю со студенческими работами здесь

Выберите атрибуты тега script, описанные в спецификации HTML5?
Выберите атрибуты тега script, описанные в спецификации HTML5? async defer language later src href

Выравнивание содержимого тега li
Всем доброго утра! Нужно сделать так, чтобы картинка в центре меню (перечёркнутая белой надписью &quot;информация&quot;) была ровно...

Как вывести текст на страницу для тега <script> в jsp странице?
Привет! Есть такой код: &lt;script&gt; var map; var eventsArr = ; &lt;/script&gt;

отображение содержимого тега <style>
Здравствуйте! Содержимое тега &lt;style&gt; отображается в документе при такой записи: &lt;html &gt; &lt;head &gt; ...

Как сделать запрет ввода букв в поле для ввода input
Здравствуйте! Есть стандартное поле ввода &lt;input type='text' name='name1' size='30' maxlength='11'&gt; предназначенное для ввода...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru