За последние 24 часа нас посетили 47687 программистов и 1728 роботов. Сейчас ищут 674 программиста ...

Проверка и фильтровка данных с формы

Тема в разделе "PHP для новичков", создана пользователем Игорь_Vasinsky, 19 фев 2009.

  1. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    И снова я.

    Вот такой вопрос:

    Есть некая форма с которой передаются текстовые данные, записываються в txt файл, потом считываются из него и отображаются на html странице.

    Необходимо эти данные обработать перед записью в txt - так чтобы фильтровать html теги, причём не просто фильтровать, а удалять все теги - кроме ссылок, т.е. по факту необходимо пропускать теги с содержимым начинающихся с <a и заканчивающихся на </a>, а все остальные теги просто удалить.

    Пример:

    Юзер отправляет : <a href='ssilka.ru'>ссылка</a> - вот <font color=red size=45><b>такая ссылка вот</b></font>

    а код работает и оставляет: ссылка - вот такая ссылка вот


    как игнорировать теги понятно - htmlspecialchars (), а чтоб вот так - я не знаю есть ли отдельная функция для работы со строками, скорее всего необходимо писать отдельный алгоритм. Помогайте.
     
  2. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    о... значит нужно пропускать и не обробатыват теги начинающие с <a и заканчивающиеся на </a> и удалять все что начинается с < и заканчивается на > вот. а как ? нуно глянуть мануал !
     
  3. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    не помогло.

    Нужна помощь !
     
  4. Roker

    Roker Активный пользователь

    С нами с:
    10 апр 2007
    Сообщения:
    54
    Симпатии:
    0
    в параметр href можно записать JS. также в
    <a onClick="alert('xss')"></a> и другие из серии on*

    Так что смотри что бы не утянули сессию куки и прочее
     
  5. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    это точно ! значит ещё в алгоритм добавим удаление из строки "onclick" и "alert" - на всякий случай.

    а вообще меня очень пугает <js></js> !

    Можно сделать было просто в форме ввода добавить поле для www - а на всё остальное выкидавать echo "теги запрещены" , но это слишком просто.

    А мы лёгких путей не ищем !

    Вопрос открыт.
     
  6. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Не надо удалять onclick. надо составить регулярку которая принимает только пригодный тебе тег ссылки, то есть только сам тег а, атрибут href и содержимое тега (то что между <a>и</a>). Причем в содержимом тега другие теги уже убирать жестко - только чистый текст.

    А на все события поодиночке задолбаешься думать. Почему именно onclick? А onmouseover уже можно? А если в style запихнут expression? Так что нужно определять что можно, а не что нельзя.
     
  7. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    ну тогда заморощено получается....

    чтобы код пропустил <a href=""> и из этого тега убрать style, js и оставить всё начиная с <a заканчивая > и в середине href="вместе с содержимым"

    т.е. с <a href=" и по ">
     
  8. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    код должен пропускать <a href="некий урл"> еще некий текст </a>

    И больше ничего
     
  9. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3. $search = "<a href='ssilka.ru'>ссылка</a> - вот <font color=red size=45><b>такая ссылка вот</b></font>";
    4. $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i";
    5. if(preg_match($reg, $search, $result)) { echo $result[0]; }
    6.  
     
  10. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    &lt;a[\s]+[^&gt;]*?href[\s]?=[\s\&quot;\']+(.*?)[\&quot;\']+.*?&gt;([^&lt;]+|.*?)?&lt;\/a&gt;
     
  11. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    karakh
    эт че?
     
  12. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    аналогичный вопрос
     
  13. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    эт регулярка :) только с заменами < на &lt; и так далее
    Врать не буду, писано не мной. http://regexlib.com/REDetails.aspx?regexp_id=968 - для поиска регулярок под стандартные задачи самое то.

    Эта регулярка насколько я понимаю берет именно то что надо и не берет что не надо. Ее можно слегка упростить но мне лень.
     
  14. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    а тут алгоритм другой.

    необходимо <a href="некий урл"> еще некий текст </a> пропускать в первичном ввиде, а все остальные теги не конвертить (иначе проще использовать htmlspecialchars ()) - не фиксировать их вообще - удолять до записи в txt файл
     
  15. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Чем он другой?
    ну замени обратно :) &lt; на < , &qt; на > и так далее. А потом пихай ее в if(preg_match($reg, $search, $result)) { echo $result[0]; }
     
  16. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    ну вот и я очём - зачем что то на что то менять - просто найти и в первичном виде пропустить
     
  17. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    alexeurodnepr
    прокоментируйте пожалуста - ничё не понял
     
  18. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    в частности почему в начале строки #

    и зачем используется [\s]*
     
  19. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    Господи, за что мне это?
    Если руками (!) или еще каким-нибудь методом (например, просто выведя эту строку с помощью echo) поменять в этой строке хтмл-сущности на соответстующие им символы, то получится либо
    Код (Text):
    1. <a[\s]+[^>]*?href[\s]?=[\s"']+(.*?)["']+.*?>([^<]+|.*?)?<\/a>
    либо
    Код (Text):
    1. <a[\s]+[^>]*?href[\s]?=[\s"\']+(.*?)["\']+.*?>([^<]+|.*?)?<\/a>
    отличаются они только тем, что я не помню надо ли экранировать одинарную кавычку
     
  20. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    стао быть я выбрал задачку не по уму своему.
     
  21. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    А сама задача это что? В смысле это просто задание типа тестовое или есть какая-то необходимость в таком фильтре?
     
  22. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    Есть необходимость.

    Объясняю:

    Есть форма обратной связи имеющая текстовые поля

    1. Имя
    2. email
    3. сообщение

    Форма преднозначена для связи посетителей сайта с администрацией.

    Спамеры используют данную форму естественно по своему усмотрению, рассылая спам.

    Делается это руками (добросовестно) и роботами.

    Каждый день я получаю этого спама от 2 до 20 писем - расчитывая разумеется получить реальное письмо - вместо этого один спам.

    Я решил использовать этот спам в своих целей:

    1. я собираю всё мыло из полей емайл - делаю свою базу (темболее что работа вся на скрипте - я не напрягаюсь)

    2. Все сообщения пишуться в txt файл и читаються потом отображаются на странице (так называемая доска объявлений.)


    Теперь сущность.

    На эту доску со временем через поисковики прёт траф - левый (не целевой для меня траф) - я и хочу использовать его в своих целей

    Поэтому ссылки на странице мне нужны для индекса поисковиками - а всё остальное опасно для меня т.к. может использоваться во вред меня.

    Вот.
     
  23. alexeurodnepr

    alexeurodnepr Активный пользователь

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    все это есть в мануале - раздел регулярные выражения

    **
    буду описывать своими словами...

    "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i"

    # - обрамление регуляра, может быть // \\ || не важно...)
    [\s] - пробел
    * - может быть или 0 или не ограниченное количество раз короче или есть или нет...
    i - учёт регистра выключен...
    этот символ [^>]* - т.е. после равно будет идти ЛЮБОЙ СИМВОЛ пока не встретиться >, и так же самое [^<]*

    впрочем я объяснил не понятно, лучше возьми книгу Максим Кузнецов - PHP5 на примерах там есть хорошие примеры!
     
  24. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    да ге. я всё понял. спасиб

    тогда думаю

    PHP:
    1. <?php
    2.   $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i";
    3.   $text = preg_match($reg, $search);
    4. ?>

    в итоге переменная $text обрабатываеться preg_match с пораметрами фильтр $reg

    так не пойдёт?
     
  25. Игорь_Vasinsky

    Игорь_Vasinsky Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    0
    Адрес:
    Уфа
    ой вот нагнал.... cofc исправлю


    PHP:
    1.  <?php
    2.    $reg = "#(<[\s]*a[\s]*href[\s]*=[^>]*>[^<]*<[\s]*/a[\s]*>)#i";
    3.    $text = preg_match($reg, $text);
    4.  ?>

    вот так вот ?