|
|
|
| Здравствуйте.
Требуется поставить панель TinyMCE для того что бы посетители сайта могли создавать форматированный текст. И тут вопрос, как обеспечить безопасность. Если я вставляю хотя бы mysql_real_escape_string то в результате выводятся символы которых не должно быть (понятно почему). Просто оставить $_POST тоже нельзя, ведь злоумышленник может отключить JavaScript и убивать базу как захочет.
Как быть в такой ситуации? | |
|
|
|
|
|
|
|
для: Den*s
(11.07.2011 в 11:46)
| | mysql_real_escape_string оставьте, а на выводе сообщений (если они имеются) заменяйте символы ",',` спец символами типа ’ | |
|
|
|
|
|
|
|
для: Гавриленко Дмитрий
(11.07.2011 в 11:59)
| | А чем лучше заменять, что бы работало побыстрее: регулярными выражениями или строковыми функциями? | |
|
|
|
|
|
|
|
для: 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. Можно ещё больше ужесточить проверку и каждому тегу назначить свой список разрешённых тегов. | |
|
|
|
|
|
|
|
для: Саня
(11.07.2011 в 15:30)
| | спасибо за код, буду разбирать и применять. | |
|
|
|
|
|
|
|
для: Den*s
(11.07.2011 в 11:46)
| | Не создайте случайно у себя XSS дыру при этом только - всегда проверяйте получаемые данные от пользователя на наличие запрещенных, незакрытых и т.п. тегов и их атрибутов, и их свойств.
Это же касается принятия файлов на сервер - смотрите что бы вам не залили какой-нибудь php скрипт. | |
|
|
|