Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

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

 

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

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

тема: Панель TinyMCE и безопасность
 
 автор: Den*s   (11.07.2011 в 11:46)   письмо автору
 
 

Здравствуйте.
Требуется поставить панель TinyMCE для того что бы посетители сайта могли создавать форматированный текст. И тут вопрос, как обеспечить безопасность. Если я вставляю хотя бы mysql_real_escape_string то в результате выводятся символы которых не должно быть (понятно почему). Просто оставить $_POST тоже нельзя, ведь злоумышленник может отключить JavaScript и убивать базу как захочет.
Как быть в такой ситуации?

  Ответить  
 
 автор: Гавриленко Дмитрий   (11.07.2011 в 11:59)   письмо автору
 
   для: Den*s   (11.07.2011 в 11:46)
 

mysql_real_escape_string оставьте, а на выводе сообщений (если они имеются) заменяйте символы ",',` спец символами типа ’

  Ответить  
 
 автор: Den*s   (11.07.2011 в 14:30)   письмо автору
 
   для: Гавриленко Дмитрий   (11.07.2011 в 11:59)
 

А чем лучше заменять, что бы работало побыстрее: регулярными выражениями или строковыми функциями?

  Ответить  
 
 автор: Саня   (11.07.2011 в 15:30)   письмо автору
 
   для: Den*s   (11.07.2011 в 14:30)
 

Я рекомендую не вырезать из текста зловредные конструкции, а полностью отказать пользователю в приёме его сообщения. Если код напичкан скриптами, то ничего полезного от его сообщения можно не ожидать. Да и мороки много с первого раза написать надёжный код для вырезания лишки. Пока отдебажите, напичкают SQL-инъекциями по самую макушку.

А обрабатывать лучше каким-нибудь XML-парсером, например так:
<?
function isSafe($data) {
  
$allowed_tags = array('b''i''s''a''p'); // разрешенные теги
  
$allowed_attrs = array('style''align'); // разрешенные артибуты тега
  
try {
    
$doc = new SimpleXMLIterator('<root>'.$data.'</root>');
  } catch ( 
Exception $e ) {
    return 
false;
  }
  if ( !
$doc ) return false;

  foreach ( 
$doc as $ele ) {
    foreach ( 
$ele->attributes() as $name => $val ) {
      if ( !
in_array(strtolower($name), $allowed_attrs) ) {
        return 
false;
      }
    }
    if ( !
in_array(strtolower($ele->getName()), $allowed_tags) ) {
      return 
false;
    }
  }
  return 
true;
}

if ( !
isSafe('<p><B onclick="hello xss"><script>hello xss</script>tes<i>t</i></B></p>') ) {
  print 
'Вам отказано в приёме вашего сообщения';
} else {
  print 
'Сообщение добавлено';
}


Простой и надёжный способ. Но должны выполняться несколько условий:
1. валидный XML
2. кодировка utf-8

С первым проблем быть не должно, так как за валидностью следит сам браузер. Поэтому невалидный документ скорее всего был набран не в визуальном редакторе и ничего хорошего от него ждать не стоит. С кодировкой тоже всё просто. iconv спасёт.

Вам останется заполнить белые списки $allowed_tags и $allowed_attrs. Можно ещё больше ужесточить проверку и каждому тегу назначить свой список разрешённых тегов.

  Ответить  
 
 автор: Den*s   (11.07.2011 в 17:48)   письмо автору
 
   для: Саня   (11.07.2011 в 15:30)
 

спасибо за код, буду разбирать и применять.

  Ответить  
 
 автор: Гость   (11.07.2011 в 12:10)   письмо автору
 
   для: Den*s   (11.07.2011 в 11:46)
 

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

Это же касается принятия файлов на сервер - смотрите что бы вам не залили какой-нибудь php скрипт.

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

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