И снова я. Вот такой вопрос: Есть некая форма с которой передаются текстовые данные, записываються в txt файл, потом считываются из него и отображаются на html странице. Необходимо эти данные обработать перед записью в txt - так чтобы фильтровать html теги, причём не просто фильтровать, а удалять все теги - кроме ссылок, т.е. по факту необходимо пропускать теги с содержимым начинающихся с <a и заканчивающихся на </a>, а все остальные теги просто удалить. Пример: Юзер отправляет : <a href='ssilka.ru'>ссылка</a> - вот <font color=red size=45><b>такая ссылка вот</b></font> а код работает и оставляет: ссылка - вот такая ссылка вот как игнорировать теги понятно - htmlspecialchars (), а чтоб вот так - я не знаю есть ли отдельная функция для работы со строками, скорее всего необходимо писать отдельный алгоритм. Помогайте.
о... значит нужно пропускать и не обробатыват теги начинающие с <a и заканчивающиеся на </a> и удалять все что начинается с < и заканчивается на > вот. а как ? нуно глянуть мануал !
в параметр href можно записать JS. также в <a onClick="alert('xss')"></a> и другие из серии on* Так что смотри что бы не утянули сессию куки и прочее
это точно ! значит ещё в алгоритм добавим удаление из строки "onclick" и "alert" - на всякий случай. а вообще меня очень пугает <js></js> ! Можно сделать было просто в форме ввода добавить поле для www - а на всё остальное выкидавать echo "теги запрещены" , но это слишком просто. А мы лёгких путей не ищем ! Вопрос открыт.
Не надо удалять onclick. надо составить регулярку которая принимает только пригодный тебе тег ссылки, то есть только сам тег а, атрибут href и содержимое тега (то что между <a>и</a>). Причем в содержимом тега другие теги уже убирать жестко - только чистый текст. А на все события поодиночке задолбаешься думать. Почему именно onclick? А onmouseover уже можно? А если в style запихнут expression? Так что нужно определять что можно, а не что нельзя.
ну тогда заморощено получается.... чтобы код пропустил <a href=""> и из этого тега убрать style, js и оставить всё начиная с <a заканчивая > и в середине href="вместе с содержимым" т.е. с <a href=" и по ">
PHP: <?php $search = "<a href='ssilka.ru'>ссылка</a> - вот <font color=red size=45><b>такая ссылка вот</b></font>"; $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i"; if(preg_match($reg, $search, $result)) { echo $result[0]; }
эт регулярка только с заменами < на < и так далее Врать не буду, писано не мной. http://regexlib.com/REDetails.aspx?regexp_id=968 - для поиска регулярок под стандартные задачи самое то. Эта регулярка насколько я понимаю берет именно то что надо и не берет что не надо. Ее можно слегка упростить но мне лень.
а тут алгоритм другой. необходимо <a href="некий урл"> еще некий текст </a> пропускать в первичном ввиде, а все остальные теги не конвертить (иначе проще использовать htmlspecialchars ()) - не фиксировать их вообще - удолять до записи в txt файл
Чем он другой? ну замени обратно < на < , &qt; на > и так далее. А потом пихай ее в if(preg_match($reg, $search, $result)) { echo $result[0]; }
Господи, за что мне это? Если руками (!) или еще каким-нибудь методом (например, просто выведя эту строку с помощью echo) поменять в этой строке хтмл-сущности на соответстующие им символы, то получится либо Код (Text): <a[\s]+[^>]*?href[\s]?=[\s"']+(.*?)["']+.*?>([^<]+|.*?)?<\/a> либо Код (Text): <a[\s]+[^>]*?href[\s]?=[\s"\']+(.*?)["\']+.*?>([^<]+|.*?)?<\/a> отличаются они только тем, что я не помню надо ли экранировать одинарную кавычку
А сама задача это что? В смысле это просто задание типа тестовое или есть какая-то необходимость в таком фильтре?
Есть необходимость. Объясняю: Есть форма обратной связи имеющая текстовые поля 1. Имя 2. email 3. сообщение Форма преднозначена для связи посетителей сайта с администрацией. Спамеры используют данную форму естественно по своему усмотрению, рассылая спам. Делается это руками (добросовестно) и роботами. Каждый день я получаю этого спама от 2 до 20 писем - расчитывая разумеется получить реальное письмо - вместо этого один спам. Я решил использовать этот спам в своих целей: 1. я собираю всё мыло из полей емайл - делаю свою базу (темболее что работа вся на скрипте - я не напрягаюсь) 2. Все сообщения пишуться в txt файл и читаються потом отображаются на странице (так называемая доска объявлений.) Теперь сущность. На эту доску со временем через поисковики прёт траф - левый (не целевой для меня траф) - я и хочу использовать его в своих целей Поэтому ссылки на странице мне нужны для индекса поисковиками - а всё остальное опасно для меня т.к. может использоваться во вред меня. Вот.
все это есть в мануале - раздел регулярные выражения ** буду описывать своими словами... "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i" # - обрамление регуляра, может быть // \\ || не важно...) [\s] - пробел * - может быть или 0 или не ограниченное количество раз короче или есть или нет... i - учёт регистра выключен... этот символ [^>]* - т.е. после равно будет идти ЛЮБОЙ СИМВОЛ пока не встретиться >, и так же самое [^<]* впрочем я объяснил не понятно, лучше возьми книгу Максим Кузнецов - PHP5 на примерах там есть хорошие примеры!
да ге. я всё понял. спасиб тогда думаю PHP: <?php $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i"; $text = preg_match($reg, $search); ?> в итоге переменная $text обрабатываеться preg_match с пораметрами фильтр $reg так не пойдёт?
ой вот нагнал.... cofc исправлю PHP: <?php $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i"; $text = preg_match($reg, $text); ?> вот так вот ?