отфильтровать URL

Тема в разделе "Как сделать...", создана пользователем stalxed, 8 июн 2008.

Статус темы:
Закрыта.
  1. stalxed

    stalxed Постоялец

    Регистр.:
    29 мар 2007
    Сообщения:
    61
    Симпатии:
    8
    Парсю с текста всё что есть в теге <a href="">
    Но не всегда там содержится обычные ссылки, а именно иногда встречаются значения:
    mailto:autobook@nm.ru
    javascript:document.login.submit()
    и тд... и я не знаю всех таких левых значений, мне нужны ссылки только вида
    /1.php
    1.php
    /
    ../1.php
    http://ya.ru
    И так далее! Как можно отфильтровать ссылки?!

    // By Jeurey: Мы не на зоне - подпись почисть.
     
  2. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    В твоем вопросе - ответ. Проверяй наличие нужного расширения в URL. Ну и если символ единственный - /. Остальные ведь тебе не нужны...
     
  3. stalxed

    stalxed Постоялец

    Регистр.:
    29 мар 2007
    Сообщения:
    61
    Симпатии:
    8
    я не знаю что вообще можно запихивать в <a href="">
    майл то подчистить дело двух секунд, а вот все способы JS вписать в <a href> я не знаю... и что может в теге кроме вышеупомянутого попасться?
     
  4. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Может, это поможет? =)

    PHP:
        function __construct()
        {
            
    $this->unsafe_html = array();
            
            
    // Составляем список валидирующих регулярных выражений
            
    $this->unsafe_html[] = '!javascript\s*:!is';
            
    $this->unsafe_html[] = '!vbscri?pt\s*:!is';
            
    $this->unsafe_html[] = '!<\s*embed.*swf!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onabort\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onblur\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onchange\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onfocus\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onmouseout\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onmouseover\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onload\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onreset\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onselect\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onsubmit\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onunload\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onerror\s*=!is';
            
    $this->unsafe_html[] = '!<[^>]*[^a-z]onclick\s*=!is';
        }
     
    stalxed нравится это.
  5. stalxed

    stalxed Постоялец

    Регистр.:
    29 мар 2007
    Сообщения:
    61
    Симпатии:
    8
    Спасибо за ответ.
    Первые три строчки интересны, а вот остальные
    <a href="http://www.w3schools.com" target="_blank" onmouseover="mouseOver()" onmouseout="mouseOut()">
    Теги mouseOver нам не особо интересны, они вне оператора href... Мне интересен только он.
    А откуда этот код если не секрет?
    ______________________
    Странно, вот попробовал пример,
    Выдал вот что
    Array ( [scheme] => javaScript [path] => document.login.submit() )
    Я ожидал другого((
    Получается что если в теге url идет что-то до двоеточия, то это указание какого-то действия: протокола(http, ftp), языка программирования(javaScript, vbscript) и т.д. Но это в ходе экспериментов предположение, где найти теорию?
     
  6. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Код, вообще говоря, из валидатора на xss-уязвимости. Кстати, вариант с parse_url тоже неплохой. ;)
     
  7. stalxed

    stalxed Постоялец

    Регистр.:
    29 мар 2007
    Сообщения:
    61
    Симпатии:
    8
    да....решение оказалось проще теории
    Данная функция смотрит uri и если это http линьк то возращает true, в противном случае false. Нужно для обработки значений полученных с тега <a href="">
    Тоесть для
    javascript:document.location=
    javascript:document.login.submit()
    mailto:autobook@nm.ru
    vbscript:helloWorld
    вернёт FALSE, а для
    http://www.alexa.com/site/ds/top_sites?cc=RU&ts_mode=country〈=none
    help.php?page=about
    login.php
    ../1.php
    TRUE
    Код:
    	function isHttp($uri)
    	{
    		$scheme = @parse_url($uri, PHP_URL_SCHEME);
    		if (!$scheme)
    		{
    		    return TRUE;
    		}
    		elseif (strcasecmp($scheme, 'http') == 0)
    		{
    		    return TRUE;
    		}
    		else
    		{
    		    return FALSE;
    		}
    
    	}
    
    вот ссылка по теории http://msdn.microsoft.com/en-us/library/aa767739(VS.85).aspx
     
Статус темы:
Закрыта.