Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.07.2012, 18:11
Интересующийся
Отправить личное сообщение для Spark Посмотреть профиль Найти все сообщения от Spark
 
Регистрация: 19.07.2012
Сообщений: 12

Запретить символ в УРЛ-ах
Есть уязвимость в elfchat, если пользователь кидает такую сссылку: http://сайт/chat/exit.php?img=exit.jpg
То всех из чата выкидывает.

Создатель чата пишет:
Тут нужно исправить регулярку - запретить "?" в URL-ах.

Но как это сделать так и не написал.
вот кусок кода, как я понял в нем нужно поставить запрет:
// URI
            var regexUrl = /(https?):\/\/((?:[a-z0-9.-]|%[0-9A-F]{2}){3,})(?::(\d+))?((?:\/(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})*)*)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?/i;
            function UriCallback(m,p1,p2,p3,p4,p5,p6,p7,p8,p9)
            {
                this.uri_count = ++this.uri_count || 0;
                var a_uri = '#uri_' + this.uri_count;
                if(opt.images)
                {
                    var ext = m.match(/\.([a-z0-9]+)$/i);
                    if(ext != null)
                    {
                        if( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )
                        {
                            var img = new load_image(m);
                            img.load = function () {
                                var w = img.width;
                                var h = img.height;
                                var max = 300;
                                if(w > max)
                                {
                                    w = max;
                                    var p = img.width / max;
                                    h = img.height / p;
                                }
                                if(h > max)
                                {
                                    h = max;
                                    var p = img.height / max;
                                    w = img.width / p;
                                }
                                var img_html = '<img src="'+m+'" style="width:'+w+'px; height:'+h+'px;">';
                                if(images_count++ < opt.max_images)
                                {
                                    setTimeout(function () {
                                        $(a_uri).html(img_html);
                                        if(opt.scroll)
                                            Messages.scroll(1);
                                    }, 1);
                                }
                            }
                        }
                    }
                }
                return '<a id="uri_'+this.uri_count+'" href="'+m+'" target="_blank">'+m+'</a>';
            }
            msg = msg.replace(regexUrl, UriCallback);
        }

Помогите кому не в лом, буду благодарен
Также прилагаю в архиве весь js фаил.
chat.rar
Ответить с цитированием
  #2 (permalink)  
Старый 19.07.2012, 18:26
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

проверять на эту регулярку перед отправкой сообщения,если есть совпадение -не отправлять
/\/chat\/exit\.php\?img=exit\.jpg/
Ответить с цитированием
  #3 (permalink)  
Старый 19.07.2012, 19:21
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

попробуйте поменять эту строку:
if( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )


На такую
if(( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )&&m.match(/(http:\/\/[^\s\?]+)\.(?:jpg|jpeg|gif|png)/ig)==null)



(*Поправил
Ответить с цитированием
  #4 (permalink)  
Старый 19.07.2012, 20:22
Интересующийся
Отправить личное сообщение для Spark Посмотреть профиль Найти все сообщения от Spark
 
Регистрация: 19.07.2012
Сообщений: 12

Сообщение от Deff Посмотреть сообщение
попробуйте поменять эту строку:
if( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )


На такую
if(( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )&&m.match(/(http:\/\/[^\s\?]+)\.(?:jpg|jpeg|gif|png)/ig)==null)



(*Поправил
Не работает, баг остался
Ответить с цитированием
  #5 (permalink)  
Старый 19.07.2012, 20:36
Интересующийся
Отправить личное сообщение для Spark Посмотреть профиль Найти все сообщения от Spark
 
Регистрация: 19.07.2012
Сообщений: 12

кроме .jpg другие форматы также приводят к вылету ,естественно. Думаю Deff близок к истине, однако чтото не так
Ответить с цитированием
  #6 (permalink)  
Старый 19.07.2012, 20:41
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Spark,
Тады так:
// URI
            var regexUrl = /(https?):\/\/((?:[a-z0-9.-]|%[0-9A-F]{2}){3,})(?::(\d+))?((?:\/(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})*)*)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:\/?@]|%[0-9A-F]{2})*))?/i;
            function UriCallback(m,p1,p2,p3,p4,p5,p6,p7,p8,p9)
            {
            if(m.match(/(http:\/\/[^\s\?]+)\.(?:jpg|jpeg|gif|png)/ig)==null)
              {
                this.uri_count = ++this.uri_count || 0;
                var a_uri = '#uri_' + this.uri_count;
                if(opt.images)
                {
                    var ext = m.match(/\.([a-z0-9]+)$/i);
                    if(ext != null)
	    var rep = /[?]/;
	    if (rep.test(value))
	    {value = value.replace(rep, ''); input.value = value;} 
                    {
                        if( ext[1] == "jpg" || ext[1] == "jpeg" || ext[1] == "gif" || ext[1] == "png" )
                        {
                            var img = new load_image(m);
                            img.load = function () {
                                var w = img.width;
                                var h = img.height;
                                var max = 300;
                                if(w > max)
                                {
                                    w = max;
                                    var p = img.width / max;
                                    h = img.height / p;
                                }
                                if(h > max)
                                {
                                    h = max;
                                    var p = img.height / max;
                                    w = img.width / p;
                                }
                                var img_html = '<img src="'+m+'" style="width:'+w+'px; height:'+h+'px;">';
                                if(images_count++ < opt.max_images)
                                {
                                    setTimeout(function () {
                                        $(a_uri).html(img_html);
                                        if(opt.scroll)
                                            Messages.scroll(1);
                                    }, 1);
                                }
                            }
                        }
                    }
                }
                return '<a id="uri_'+this.uri_count+'" href="'+m+'" target="_blank">'+m+'</a>';
            }
            msg = msg.replace(regexUrl, UriCallback);
          }
        }

Последний раз редактировалось Deff, 19.07.2012 в 20:56.
Ответить с цитированием
  #7 (permalink)  
Старый 19.07.2012, 20:45
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

вообще то подобные дырки нужно закрывать на стороне сервера а не на стороне клиента.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #8 (permalink)  
Старый 19.07.2012, 20:51
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

devote,
Там фигня в том что подгружаемый URL картинки = не картинка = а HTML cтраница( это защита хостингов картинок хранения для выдачи рекламы - тут вродь сервер чата не причем? Ну кнешн можно переваивать скрипт на парсинг картинок сервером - а не на клиенте

Последний раз редактировалось Deff, 19.07.2012 в 20:54.
Ответить с цитированием
  #9 (permalink)  
Старый 19.07.2012, 20:51
Интересующийся
Отправить личное сообщение для Spark Посмотреть профиль Найти все сообщения от Spark
 
Регистрация: 19.07.2012
Сообщений: 12

Deff,
всё равно вылетает.
Причем вообще не важно какой формат написан после точки, щас проверил
Ответить с цитированием
  #10 (permalink)  
Старый 19.07.2012, 20:54
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

В чем заключается уязвимость то? Как она влияет на скрипты?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как получить загружений урл iframe или frame NOCaut Events/DOM/Window 0 15.11.2011 14:51
Как можно в DIV_е с включенным contentEditable запретить использовать <SCRIPT> и <A>? Маэстро Events/DOM/Window 11 02.07.2011 20:00
Проверка УРЛ в поле формы alex19rus Javascript под браузер 2 24.06.2011 11:33
найти и удалить символ ivanweb jQuery 6 07.06.2009 22:47
Как узнать в каком регистре напечатан русский символ на яваскрипте IGAHDF Я не знаю javascript 2 28.05.2009 19:50