Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XSS Link Cleaner, Функция 
V
    Опции темы
kat_ru
Дата 4.3.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Насколько актуальна функция ниже?
Критика, пожелания, что можно или нужно изменить - исправить? Если не сложно как?

Заранее благодарен за ответ.

Код

    function XSSLinkCleaner() {
        $flag = 0;
        $QString = html_entity_decode( urldecode( $_SERVER['QUERY_STRING'] ) );
        $var = explode("&", $QString);
             foreach($var as $k => $v) {
                if (
                    !strpos($v, "<")  and !strpos($v, ">")  and
                    !strpos($v, "'")  and !strpos($v, "/")  and
                    !strpos($v, ".")  and !strpos($v, ",")  and
                    !strpos($v, "|")  and !strpos($v, "%")  and
                    !strpos($v, ";")  and !strpos($v, "*")  and
                    !strpos($v, "?")  and !strpos($v, "}")  and
                    !strpos($v, "{")  and !strpos($v, "]")  and
                    !strpos($v, "[")  and !strpos($v, "+")  and
                    !strpos($v, "-")  and !strpos($v, "(")  and
                    !strpos($v, ")")  and !strpos($v, "^")  and
                    !strpos($v, "$")  and !strpos($v, "~")  and
                    !strpos($v, "@")  and !strpos($v, "!")  and
                    !strpos($v, " ")  and !strpos($v, "\"") and
                    !strpos($v, "\\") and !strpos($v, "^")  and
                    !strpos($v, "`")  and !strpos($v, ":")
                ) {
                    if (!is_null($v) and $v !== "") $var_tmp[] = $v;
                } else $flag = 1;
            }
            if (isset($var_tmp) and count($var_tmp) > 0) {
                foreach($var_tmp as $k => $v) {
                    $NQString .= ($k == 0) ? "?".$v : $v;
                }
            } else $NQString = "?";
            if ($flag == 1) header("Location: ".$NQString."", TRUE, 301);
    }


Это сообщение отредактировал(а) kat_ru - 4.3.2008, 15:50
PM MAIL   Вверх
A1ekcandr
Дата 4.3.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 99
Регистрация: 27.6.2007

Репутация: 1
Всего: 1



зачем столько strpos в этом случае сделть легче через регулярное выражение
PM MAIL   Вверх
mishaSL
Дата 4.3.2008, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



Согласен c A1ekcandr, проще через 1 регулярное выражение.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
GeneralElectric
Дата 4.3.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Непонятно, зачем такой большой набор символов.
Вообще, было бы неплохо, если автор словами сформулировал задачу, которую он хочет решить.
В таких вопросах всегда полезно это делать, поскольку толкование XSS уязвимости у всех может быть разным.

PM MAIL   Вверх
kat_ru
Дата 4.3.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Например так?
Код

    function XSSLinkCleaner() {
        $flag = 0;
        $QString = html_entity_decode( urldecode( $_SERVER['QUERY_STRING'] ) );
        $var = explode("&", $QString);
        $preg = "[!|@|#|\\$|%|\^|&|\*|\(|\)|-|_|<|>|\?|,|;|:|\"|'|`|~|\\\|\||{|}|\[|\]]";
        if (is_array($var) and count($var) > 0) {
            foreach ($var as $k => $v) {
                if (!is_null($v) and $v !== "") {
                    if (preg_match($preg, $v)) $flag = 1;
                    else $NQString .= ($k == 0) ? "?".$v : "&".$v;
                }
            }
            if ($flag == 1) {
                $NQString = ($NQString == "" or is_null($NQString)) ? "?" : $NQString;
                header("location: ".$NQString."", true, 301);
            }
        }
    }



GeneralElectric
    Избавить адресную строку от ненужных символов...
Хотя наверно проще и надежней сделать список только разрешенных символов.
PM MAIL   Вверх
source777
Дата 5.3.2008, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 2
Всего: 56



Цитата

  $preg = \"[!|@|#|\\\\$|%|\\^|&|\\*|\\(|\\)|-|_|<|>|\\?|,|;|:|\\\"|\'|`|~|\\\\\\|\\||{|}|\\[|\\]]\";
Прочитай описание синтаксиса регэкспов и поясни нафига ты этот забор из | построил?

Цитата(kat_ru @  4.3.2008,  17:42 Найти цитируемый пост)
Хотя наверно проще и надежней сделать список только разрешенных символов.
Вот именно, а ещё лучше сразу весь URI проверить на соответствие: |^[a-z 0-9\\.:_-/]+$|i 

P.S. Что тут на форуме за злобный баг, слеши обратные расставляющий???




Это сообщение отредактировал(а) source777 - 5.3.2008, 00:32


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
kat_ru
Дата 5.3.2008, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Цитата(source777 @  5.3.2008,  00:29 Найти цитируемый пост)
Цитата(kat_ru @  4.3.2008,  17:42 Найти цитируемый пост)
Хотя наверно проще и надежней сделать список только разрешенных символов.
Вот именно, а ещё лучше сразу весь URI проверить на соответствие: |^[a-z 0-9\\.:_-/]+$|i 

P.S. Что тут на форуме за злобный баг, слеши обратные расставляющий???


У меня с регулярками туго... ((( Не понимаю и писец... Перечитывал уже раз 10 на php.net

Если не сложно можете по символьно объяснить логику вот этого выражения: " |^[a-z 0-9\\.:_-/]+$|i  "
PM MAIL   Вверх
SelenIT
Дата 5.3.2008, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(kat_ru @  5.3.2008,  01:45 Найти цитируемый пост)
по символьно объяснить логику вот этого выражения: " |^[a-z 0-9\\.:_-/]+$|i  " 

| - открывающий ограничитель шаблона
^ - начало строки
[ - начало символьного класса, допускающего:
a-z - лат.буквы
  - пробел (не понимаю только, нафига он в урле — по-моему, он лишний)
0-9 - цифры (можно написать короче - \d)
\\ - обратный слеш (заэкранирован, чтобы PHP не подумал, что это заэкранированная точка. Кстати, в урле обратный слеш, имхо, тоже не нужен)
. : _ / - любой из этих символов
- - вообще-то, между символами внутри квадратных скобок задает диапазон символов. Но в данном случае начало диапазона (_ - 0x5F) находится в кодовой таблице раньше его конца (/ - 0x2F), поэтому, судя по мануалу
Цитата

Символ минус '-' внутри класса используется для задания символьного диапазона. Например, [d-m] соответствует любому символу, находящемуся между 'd' и 'm', включая сами символы 'd' и 'm'. В случае, если '-' необходим, как член класса, он должен находиться в такой позиции, в которой он не может интерпретироваться как диапазон (как правило, это первый и последний символ описания класса) либо экранироваться при помощи обратного слеша.
будет интерпретироваться как собственно дефис. Лучше, конечно, подобных неоднозначностей не допускать и следовать совету выше.
] - конец символьного класса
+ - означает, что входящие в класс символы могут встречаться один и более раз
$ - конец строки.
| - закрывающий ограничитель шаблона
i - модификатор, указывающий на независимость от регистра

Все вместе означает, что строка должна от начала до конца состоять из ненулевого количества символов, перечисленных в классе, без учета регистра букв.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
source777
Дата 6.3.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 2
Всего: 56



Цитата(SelenIT @  5.3.2008,  03:36 Найти цитируемый пост)
\\\\ - обратный слеш (заэкранирован, чтобы PHP не подумал, что это заэкранированная точка. Кстати, в урле обратный слеш, имхо, тоже не нужен)
[cuted]он не заэкранирован, это как раз заэкранированная точка, но этот дурацкий форум добавляет обратные слеши в моих сообщениях и к кавычкам \" \' и к обратным слешам \\... ТАМ ДОЛЖЕН БЫТЬ ОДИН ОБРАТНЫЙ СЛЕШ, А НЕ ДВА. не смогли на форуме нормально addslashes, stripslashes применить...

Цитата

Лучше, конечно, подобных неоднозначностей не допускать и следовать совету выше
Да, дефис лучше заэкранировать, но в свете вышеобозначенной проблемы, это добавило бы ещё больше неоднозначностей из за повторного экранирования слешей движком форума...

Цитата(SelenIT @  5.3.2008,  03:36 Найти цитируемый пост)
 пробел (не понимаю только, нафига он в урле — по-моему, он лишний)
По всякому бывает, пример Wkipedia нормально обрабатывает пробелы в URL, так что может и пригодиться, но это конечно по желанию...


kat_ru, общий смысл |^[a-z 0-9\\.:_-/]+$|i состоит в том, чтобы проверить, что URL состоит из латинских букв, цифр, пробелов, точек, значков подчёркивания, дефисов, двоеточий, прямых и обратных слешей. 
Ещё более мощным решением будет вырезать из URL все символы кроме вышеобозначенных, тогда сайт даже не заметит, что была попытка ввести какие-то иные символы...

P.S. Поскольку я уже отчаялся добиться от этого форума вменяемой работы, то смотри вложение, надеюсь хотя бы его форум не испаганит... Код там 100%-рабочий вместе с большим комментарием...

Это сообщение отредактировал(а) skyboy - 6.3.2008, 00:55

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  clear_uri.php 1,28 Kb


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
Хрипа
Дата 6.3.2008, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 11.12.2006

Репутация: -6
Всего: нет



Я делаю так:
Код

$arr = array_merge($_POST,$_GET);
foreach($arr as $key => $value) $arr[$key] = mysql_escape_string(strip_tags($value));

Если у вас уже готовый скрипт то интегрировать можно так:
Код

foreach($_GET as $key => $value) $_GET[$key] = mysql_escape_string(strip_tags($value));

--------------------
<Вырезана, как не соответствующая правилам форума >
PM MAIL   Вверх
solenko
Дата 6.3.2008, 11:00 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



А смысл в такой фильтрации на входе? Фильтровать нужно:
1. На этапе вставки в базу (от того, тчо может вызвать креш базы)
2. На выводе данных (от всего, чего мы не ждем в выводе)

А то как-то сомнительна практическая ценность получается.
1. Как сохранить html (это нужно практически в каждом проекте)? 
2. Вы расчитываете, что в базе у вас корректные данные, т.к. вы их туда вставили. Но вы забываете, что отдаете проект заказчику. И он может, например, импортировать данные в базу минуя ваши фильтры.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 6.3.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Согласен с Solenko. Просто фильтровать URL вот так - пытаться убить конкретных людей с помощью выброса атомной бомбы на целую страну. Не проще ли отфильтровать те параметры, которые надо отфильтровать а не пускать все под общую гребенку? К тому же если захотим вдруг пропустить фильтруемые символы, придется отключать эту фильтровалку и писать отдельно под каждый запрос (что и надо было делать).

Это сообщение отредактировал(а) flashaa - 6.3.2008, 11:46
PM MAIL   Вверх
SelenIT
Дата 6.3.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(source777 @  6.3.2008,  00:27 Найти цитируемый пост)
это как раз заэкранированная точка

В квадратных скобках точку экранировать не надо.

Цитата(source777 @  6.3.2008,  00:27 Найти цитируемый пост)
пример Wkipedia нормально обрабатывает пробелы в URL

Сорри, прошу доказательств. Желательно не через браузер (который любезно сам заменяет пробелы на %20 при сабмите), а в виде скриншота сессии телнета.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
kat_ru
Дата 6.3.2008, 14:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



Цитата

А смысл в такой фильтрации на входе? Фильтровать нужно:
1. На этапе вставки в базу (от того, тчо может вызвать креш базы)
2. На выводе данных (от всего, чего мы не ждем в выводе)

А то как-то сомнительна практическая ценность получается.
1. Как сохранить html (это нужно практически в каждом проекте)? 
2. Вы расчитываете, что в базе у вас корректные данные, т.к. вы их туда вставили. Но вы забываете, что отдаете проект заказчику. И он может, например, импортировать данные в базу минуя ваши фильтры.



предположим на страничке есть <div id="main"></div>
в случае если зайти на страничку по такой ссылке: http://host/?a=<script>getE...).innerHTML=XSS Here!</script> то это и будет XSS.

Цитата

Я делаю так:
Выделить всёкод PHP
1:
2:
    
$arr = array_merge($_POST,$_GET);
foreach($arr as $key => $value) $arr[$key] = mysql_escape_string(strip_tags($value));

Если у вас уже готовый скрипт то интегрировать можно так:
Выделить всёкод PHP
1:
    
foreach($_GET as $key => $value) $_GET[$key] = mysql_escape_string(strip_tags($value));


Для POST данных нужен немного другой подход... ибо каждая форма имеет свой обработчик. А например mysql_escape_string (кстати: mysql_real_escape_string) не сработает и даже выведет ошибку в случае если нет активного соединения с БД...


Код

   function XSSLinkCleaner() {
........................
            if ($flag == 1) {
                $NQString = ($NQString == "" or is_null($NQString)) ? "?" : $NQString;
                header("location: ".$NQString."", true, 301);
            }
        }
    }


строка "header("location: ".$NQString."", true, 301);"

301 Статус заголовка HTTP скажет поисковикам например, что страница переехала окончательно и накопленный рейтинг надо бы перенести на $NQString.

Ведь если на множество форумов распространят ссылку http://host/?a=<script>getE...L="XSS Here!";</script> то это цитируемость страницы... которая переместиться на http://host/?

Поправьте если не прав...

Спасибо всем! Думаю вопрос решен...



PM MAIL   Вверх
SelenIT
Дата 6.3.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



Цитата(kat_ru @  6.3.2008,  14:07 Найти цитируемый пост)
в случае если зайти на страничку по такой ссылке: http://host/?a=<script>getE...).innerHTML=XSS Here!</script> то это и будет XSS.

Да ну? Яваскрипт из адресной строки может выполниться в одном случае - по "ссылке" с "протоколом" javascript:. Другое дело, если в коде страницы где-то вызывается echo $_GET['a']  без проверки (например, перед результатами поиска отображается сама поисковая фраза) - тогда да, возможностей "творчески переосмыслить" эту страницу масса smile. Но это как раз второй случай в списке solenko.

Цитата(kat_ru @  6.3.2008,  14:07 Найти цитируемый пост)
кстати: mysql_real_escape_string) не сработает и даже выведет ошибку в случае если нет активного соединения с БД...

Правильно, это ее документированное поведение. Потому что зачем она нужна, если не собираетесь ничего записывать? А если собираетесь - то почему не готовы? ;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1004 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.