Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Спецсимволы HTML in Textara
 
 автор: Deed   (01.09.2012 в 12:56)   письмо автору
22.5 Кб
 
 

Здравствуйте!
По ряду причин в своем проекте использую nicEditor (http://nicedit.com/), который вешаю на textarea формы.
Суть его скрипта - скрытие непосредственно текстареи и работа в диве с contenteditable="true". Когда же вызывается submit(), содержимое этого дива передается в текстарею:

$('#textarea').html($('#form').find('.nicEdit-main').html());

И после этого отправляется на обработчик.

Суть вопроса.
Если вписать (или вставить) какой-либо тег, минуя панель инструментов nicEditor'a, спецсимволы этого "левого" тега заменяются их сущностями. Например, вписав (или вставив) в текстовое поле редактора такую конструкцию:
<script>alert('WTF??');</script>,
получим безобидное:
&lt;script&gt;alert('WTF??');&lt;/script&gt;

Это проверяется и алертом, и вставкой тут же на страницу (см. аттач).
Эти же сущности передаются и текстарее данной формы. НО в обработчик приходит полноценный алерт!
Если же обрабатывать $_POST['text'] htmlspecialchars'ом, тогда теряем все форматирование и стилистику текста, и смысл использования wysiwyg'a сводится на нет.
А решение

<?php
$text
=preg_replace("/<[^>\/]*script.+<[^\/>]*\/[^>]*script>/uis","",$_POST['text']);
?>

не решает проблему в целом.
Как быть?
Спасибо.

  Ответить  
 
 автор: confirm   (01.09.2012 в 13:44)   письмо автору
 
   для: Deed   (01.09.2012 в 12:56)
 

И при выборе форматирования, этот редактор сразу отображает стили, или теги?

  Ответить  
 
 автор: Deed   (01.09.2012 в 14:44)   письмо автору
27.9 Кб
 
   для: confirm   (01.09.2012 в 13:44)
 

Привет!
Да, сразу. (см.)

  Ответить  
 
 автор: confirm   (01.09.2012 в 15:12)   письмо автору
 
   для: Deed   (01.09.2012 в 14:44)
 

Жаль. Ну даже в этом случае, я бы отредактировал редактор - на клиенте теги, а отправляются ВВ-эквиваленты. Что парсить в поисках вредного среди разрешенного, что превращать ВВ в теги, как ни крути все равно карячится придется. Так уж лучше превратить разрешенное, без труда превратив в строку запрещенное и некорректное для html.

  Ответить  
 
 автор: Deed   (01.09.2012 в 15:28)   письмо автору
 
   для: confirm   (01.09.2012 в 15:12)
 

Запустите, пожалуйста, приведенный ниже код.
Попробуйте ввести в текстарею "&lt;script&gt;alert('WTF??');&lt;/script&gt;" вручную и нажать кнопку ОК! и вставить то же самое, кликом на BUT, с последующей отправкой формы.
И вы убедитесь, что, оказывается, редактор здесь не при чем...

  Ответить  
 
 автор: confirm   (01.09.2012 в 15:31)   письмо автору
 
   для: Deed   (01.09.2012 в 15:28)
 

Да не важно кто виноват, главное что вы получаете на сервере.

  Ответить  
 
 автор: Deed   (01.09.2012 в 15:37)   письмо автору
 
   для: confirm   (01.09.2012 в 15:31)
 

Утомил вас, наверное?
Ладно, проблема решения не имеет, кроме как обработки пришедших данных на сервере.
Спасибо вам преогромное, confirm!!

  Ответить  
 
 автор: confirm   (01.09.2012 в 15:41)   письмо автору
 
   для: Deed   (01.09.2012 в 15:37)
 

Нет, почему. Просто я уже сказал как бы поступил - не искать источник, а отправлять безопасное.

  Ответить  
 
 автор: Deed   (01.09.2012 в 16:08)   письмо автору
 
   для: 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 редактора.

  Ответить  
 
 автор: confirm   (01.09.2012 в 16:33)   письмо автору
 
   для: Deed   (01.09.2012 в 16:08)
 

JS тут не при чем. Вы как отдаете данные в форму пользователя? Наверное же так:
<textarea><?=htmlspecialchars($var);?></textarea>

И не удивляетесь же, что отдав в форму &lt;, получите все равно <.
Так что не стоит искать ключ к "болту", это такой механизм, без него было бы туго.

  Ответить  
 
 автор: Deed   (01.09.2012 в 16:46)   письмо автору
 
   для: confirm   (01.09.2012 в 16:33)
 

Тю! Какой же смысл в высвиге, если потом все передавать htmlspecialchars'ом???

  Ответить  
 
 автор: confirm   (01.09.2012 в 16:52)   письмо автору
 
   для: Deed   (01.09.2012 в 16:46)
 

Ну я вам о чем говорил выше? Я не знаю как работает этот редактор, не пробовал его, так что сказать определенного ничего не могу. Но вы ведь прекрасно понимаете, что среди всех этих тегов вами разрешенных, с большой вероятностью могут быть и не разрешенные, а так же символы, которые в любом случае нужно будет пропускать через htmlspecialchars() при выводе на страницу. Тоже самое и при редактировании такого кода, нужно думать об этом.

  Ответить  
 
 автор: Deed   (01.09.2012 в 18:13)   письмо автору
9.7 Кб
 
   для: confirm   (01.09.2012 в 16:33)
 

Я бы все равно поискал "болт". Чтобы понять, как он решает задачу с сущностями.
Попробуйте, все же, пример ниже. У вас не получится передать сущности, вставленные с помощью jquery (кроме text(), что лишено смысла), а вот "болт" это как-то делает.
Его срипт прикурочен.

  Ответить  
 
 автор: Deed   (01.09.2012 в 14:50)   письмо автору
 
   для: 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('&lt;script&gt;alert(\'WTF??\');&lt;/script&gt;');
    });
});

</script>


</body>
</html>


  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования