Доброго времени суток! Я хочу дать возможность пользователям вставлять HTML, чтобы было удобнее, например, вставлять таблицы. Вставлять HTML - опасно. 1) Понятно, можно создать список надёжных юзеров. НО! Модерировать каждую статью мало желания. 2) устанавливать TinyMCE в PHP-Fusion-7 нет желания, так как это мне сложно. Мне хочется найти готовую функцию для проверки HTML на безопасность и закрытость. Я так понимаю, надо проверять на отсутствие <script, onmouseover, onmousedown и закрытость всех </td> </tr> </table>. Не подскажете готовые или почти готовые варианты? как-то же проверяется HTML во всяких блогах, где можно вставлять HTML...
это ж не для удобства юзеров, это защита от недоброжелатей. про BB-коды забудьте - охота копировать HTML из FrontPage. Я так подумал, что даже если кто-то забудет скопировать </td></tr></table>, сайту это не навредит, просто вёрстка слезет. Это мелочи. У меня друг приделал полноценный редактор TinyMCE в PHP-Fusion (с полноценной загрузкой картинок!), в том числе в форум PHP-Fusion. Чудо программисткой мысли от Alipapa - редактор TinyMCE в форуме PHP-Fusion http://electric-forum.ru/ . Лично я в восторге. Но я искал вариант проще, например, на базе функции str_replace . Типа просто позаменять опасные тэги и слова. Список опасных слов не подскажете? onclick onmousedown onmouseover onmouseout ondoubleclick script iframe frame что ещё ?
А это разве нормально? Например <h1> не закрытый. Или <textarea>. А еще пишем PHP: <form method=POST action=http://mysite.ru/> и следующие комментарии будут отправляться на мой сайт, уводя посетителей с вашего.
[vs], не отвлекайте меня с пути истинного. Если чел. добавит страницу со слезшей вёрсткой, сайт не ляжет. Когда я замечу, я или поправлю, или удалю. ещё form
V0VAN истинный путь - запретить все теги, кроме разрешенных. Составить список минимально необходимых проще.
ну и как это сделать? я так понимаю, это сложный путь. надо искать конечный > у каждого тэга, а потом ещё закрывающий тэг. разве просто поудалять некоторые слова не проще?
неа PHP: <?php $str = '<form><script><b><u><h1>Preved'; $str = strip_tags($str, '<b><u>'); echo $str; далее, чтобы закрывать теги - можно просто после сообщения пользователя вставлять закрывающие теги всех разрешенных. PHP: <?php $str .= '</b></u></i>';
О! это как раз то, что я искал! благодарю! Код (Text): $str = strip_tags($str, '<table></table><tr></tr><td></td><b></b>'); чистит все остальные тэги, например <font color="green">12348</font> и оставляет конструкции типа <table align="center" width="80%" border="1" cellpadding="3" cellspacing="0" bordercolordark="white" bordercolorlight="black"> - это как раз то, что нужно! но оставляет конструкциии типа <b onmousedown="" onclick="">warning</b></td> а эти слова (onmousedown, onclick) - через str_replace ?
в данном случае на мой взгляд эффективнее и просто безопаснее с помощью регулярных выражений. Слегка повозиться с функцией которая будет заниматься этим вопросом в итоге получим 1. Удаление любых параметров тегов и не важно что там будут писать. 2. Проверка закрытых тегов и даже при желание можно их закрывать. 3. Быстрая адаптация под найденные дырки, за чем штатные функции ПХП просто не успеют. 4. При желании ведение лога запрещенных вещей кто и чего пытался всунуть на сайт, выявление потенциальных ... 4. Ну и как бонус готовая функция или класс для таких работ в будущем.
Главный принцип в том что ты задумал не написать список всего что опасно и это удалить а написать список всего что ты разрешаешь вставлять и что безопасно при этом а остальное удалить что бы это не было. А str_replace это как раз таки концепция первого варианта. С помощью простого регулярного выражения можно найти все что после тега идет к примеру <b(.*)> все что в скобках что бы там не было хоть черт лысый будет найдено и удалено или оставлено если соответствует твоим правилам безопасности. Первый вариант подразумевает следующие, появился новый тег функция возможность, ты не знал, забыл и тд и тп и не в не внес в список опасных, вот и дыра, а так даже если ты про сайт забудешь на всю жизнь система не пропустит ничего нового чего ты не разрешил.