|
 22.5 Кб |
|
| Здравствуйте!
По ряду причин в своем проекте использую nicEditor (http://nicedit.com/), который вешаю на textarea формы.
Суть его скрипта - скрытие непосредственно текстареи и работа в диве с contenteditable="true". Когда же вызывается submit(), содержимое этого дива передается в текстарею:
$('#textarea').html($('#form').find('.nicEdit-main').html());
|
И после этого отправляется на обработчик.
Суть вопроса.
Если вписать (или вставить) какой-либо тег, минуя панель инструментов nicEditor'a, спецсимволы этого "левого" тега заменяются их сущностями. Например, вписав (или вставив) в текстовое поле редактора такую конструкцию:
<script>alert('WTF??');</script>,
получим безобидное:
<script>alert('WTF??');</script>
Это проверяется и алертом, и вставкой тут же на страницу (см. аттач).
Эти же сущности передаются и текстарее данной формы. НО в обработчик приходит полноценный алерт!
Если же обрабатывать $_POST['text'] htmlspecialchars'ом, тогда теряем все форматирование и стилистику текста, и смысл использования wysiwyg'a сводится на нет.
А решение
<?php
$text=preg_replace("/<[^>\/]*script.+<[^\/>]*\/[^>]*script>/uis","",$_POST['text']);
?>
|
не решает проблему в целом.
Как быть?
Спасибо. | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 12:56)
| | И при выборе форматирования, этот редактор сразу отображает стили, или теги? | |
|
|
|
|
 27.9 Кб |
|
|
для: confirm
(01.09.2012 в 13:44)
| | Привет!
Да, сразу. (см.) | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 14:44)
| | Жаль. Ну даже в этом случае, я бы отредактировал редактор - на клиенте теги, а отправляются ВВ-эквиваленты. Что парсить в поисках вредного среди разрешенного, что превращать ВВ в теги, как ни крути все равно карячится придется. Так уж лучше превратить разрешенное, без труда превратив в строку запрещенное и некорректное для html. | |
|
|
|
|
|
|
|
для: confirm
(01.09.2012 в 15:12)
| | Запустите, пожалуйста, приведенный ниже код.
Попробуйте ввести в текстарею "<script>alert('WTF??');</script>" вручную и нажать кнопку ОК! и вставить то же самое, кликом на BUT, с последующей отправкой формы.
И вы убедитесь, что, оказывается, редактор здесь не при чем... | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 15:28)
| | Да не важно кто виноват, главное что вы получаете на сервере. | |
|
|
|
|
|
|
|
для: confirm
(01.09.2012 в 15:31)
| | Утомил вас, наверное?
Ладно, проблема решения не имеет, кроме как обработки пришедших данных на сервере.
Спасибо вам преогромное, confirm!! | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 15:37)
| | Нет, почему. Просто я уже сказал как бы поступил - не искать источник, а отправлять безопасное. | |
|
|
|
|
|
|
|
для: confirm
(01.09.2012 в 15:41)
| | Ха!! Есть, дружище confirm!!!
Не подвела интуиция!
Знач, решение снова "подогнанное". Как и в форме для поста-картинки, прикурочил к новостной форме скрытый див с задизабленной кнопкой:
<form>
.../some code/...
<div style="display: none;"><input type="submit" value="Submit" id="politsubm" disabled="disabled"/></div>
</form>
|
И клик по внешней кнопке передаю на нее:
...туда-сюда...
$('#politsubm').removeAttr('disabled').click();
|
И приходят они на сервер, эти html-сущности!
Стало быть,... хрен его знает, почему так. Скорее всего, есть какой-то "хитрый болт" в js редактора. | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 16:08)
| | JS тут не при чем. Вы как отдаете данные в форму пользователя? Наверное же так:
<textarea><?=htmlspecialchars($var);?></textarea>
|
И не удивляетесь же, что отдав в форму <, получите все равно <.
Так что не стоит искать ключ к "болту", это такой механизм, без него было бы туго. | |
|
|
|
|
|
|
|
для: confirm
(01.09.2012 в 16:33)
| | Тю! Какой же смысл в высвиге, если потом все передавать htmlspecialchars'ом??? | |
|
|
|
|
|
|
|
для: Deed
(01.09.2012 в 16:46)
| | Ну я вам о чем говорил выше? Я не знаю как работает этот редактор, не пробовал его, так что сказать определенного ничего не могу. Но вы ведь прекрасно понимаете, что среди всех этих тегов вами разрешенных, с большой вероятностью могут быть и не разрешенные, а так же символы, которые в любом случае нужно будет пропускать через htmlspecialchars() при выводе на страницу. Тоже самое и при редактировании такого кода, нужно думать об этом. | |
|
|
|
|
 9.7 Кб |
|
|
для: confirm
(01.09.2012 в 16:33)
| | Я бы все равно поискал "болт". Чтобы понять, как он решает задачу с сущностями.
Попробуйте, все же, пример ниже. У вас не получится передать сущности, вставленные с помощью jquery (кроме text(), что лишено смысла), а вот "болт" это как-то делает.
Его срипт прикурочен. | |
|
|
|
|
|
|
|
для: confirm
(01.09.2012 в 13:44)
| | Вот, для удобства.
Разница между вставкой вручную и посредством jquery, причем неважно, html() or append() etc.
Ну, а использование text() лишено смысла.
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Title</title>
</head>
<body>
<br /><br />
<button id="but">BUT</button>
<br /><br /><br />
<form action="<?$_SERVER[PHP_SELF];?>" method="post">
<textarea name="text" rows="6" cols="15" id="area"></textarea>
<br />
<input type="submit" value="OK!" />
</form>
<br />
<hr width="65%" />
<br />
<?=$_POST['text'];?>
<br />
<hr width="65%" />
<script type="text/javascript">
$(document).ready(function(){
$('#but').click(function(){
$('#area').prepend('<script>alert(\'WTF??\');</script>');
});
});
</script>
</body>
</html>
|
| |
|
|
|