Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запретить символ в УРЛ-ах (https://javascript.ru/forum/misc/29978-zapretit-simvol-v-url-akh.html)

Spark 19.07.2012 18:11

Запретить символ в УРЛ-ах
 
Есть уязвимость в 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

dmitriymar 19.07.2012 18:26

проверять на эту регулярку перед отправкой сообщения,если есть совпадение -не отправлять
/\/chat\/exit\.php\?img=exit\.jpg/

Deff 19.07.2012 19:21

попробуйте поменять эту строку:
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)



(*Поправил

Spark 19.07.2012 20:22

Цитата:

Сообщение от Deff (Сообщение 190009)
попробуйте поменять эту строку:
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)



(*Поправил

Не работает, баг остался

Spark 19.07.2012 20:36

кроме .jpg другие форматы также приводят к вылету ,естественно. Думаю Deff близок к истине, однако чтото не так

Deff 19.07.2012 20:41

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);
          }
        }

devote 19.07.2012 20:45

вообще то подобные дырки нужно закрывать на стороне сервера а не на стороне клиента.

Deff 19.07.2012 20:51

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

Spark 19.07.2012 20:51

Deff,
всё равно вылетает.
Причем вообще не важно какой формат написан после точки, щас проверил

zebra 19.07.2012 20:54

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


Часовой пояс GMT +3, время: 13:07.