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

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

Deff 19.07.2012 20:56

Spark,
Передвинул Выше

Spark 19.07.2012 21:02

Deff,
Не помогает.
Если в сервере проблема, тогда почему на других сайтах с этим чатом такая же проблема?

Deff 19.07.2012 21:23

Spark,
Еще попытка: - убрать все предыдущие правки и воткнуть сюды
function load_image(url)
{
if(url.match(/(http:\/\/[^\s\?]+)\.(?:jpg|jpeg|gif|png)/ig)==null) url=http://forum.mybb.ru/i/blank.gif;

    this.load = null;
    this.width = 0;
    this.height = 0;
    var self = this;
    var img = new Image();
    img.onload = function () {
        self.width = this.width;
        self.height = this.height;
        if(self.load != null)
            self.load(self);
    }
    img.src = url;
}

Spark 19.07.2012 21:48

Deff,
а куда именно? попробавал по разному, с этим кодом окна чата вообще не видно, только строка набора

Deff 19.07.2012 21:53

Spark,
Там в скрипте функция:

Цитата:

function load_image(url)
{
if(url.match(/(http:\/\/[^\s\?]+)\.(?:jpg|jpeg|gif|png)/ig)==null) url=http://forum.mybb.ru/i/blank.gif;

this.load = null;
this.width = 0;
this.height = 0;
var self = this;
var img = new Image();
img.onload = function () {
self.width = this.width;
self.height = this.height;
if(self.load != null)
self.load(self);
}
img.src = url;
}
добавляем в неё строку красным

Spark 19.07.2012 22:17

Deff,
без изменений, все также вылетает

Deff 19.07.2012 22:37

Тады нун просто менять эту регулярку (походу трабл именно в ней - поскольку пути за ней все исследовали
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;

Или кто седни поможет или я завтра (чот уже голова не варит

dmitriymar 19.07.2012 22:42

Цитата:

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

Цитата:

Сообщение от Spark
Если в сервере проблема, тогда почему на других сайтах с этим чатом такая же проблема?

:blink: Где хоть слово что проблема в сервере? По русски ведь сказано, что проблему нужно решать на стороне сервера, а не клиента. Ничего не помешает,при желании, обойти защиту на клиенте

Deff 19.07.2012 23:08

Spark,
:write:
Пока не остыл
Вариант NN
Это
Цитата:

msg = msg.replace(regexUrl, UriCallback);

Меняем на две строки:
Цитата:

msg = msg.replace(/http:\/\/.+?\?.*\.(?:jpg|jpeg|gif|png)/ig,'http://s1.uploads.ru/i/ISFrd.gif');
 msg = msg.replace(regexUrl, UriCallback);

(Cачкую от регулярки

Spark 19.07.2012 23:53

Deff,
Спасибо тебе за потраченное время и шевеления мозгом:thanks: , но не помогает:(

Deff 19.07.2012 23:59

Spark,
Значит до завтра

Deff 20.07.2012 00:14

Цитата:

Сообщение от Spark
но не помогает

Гы - суть наверно в том - что Вы не переименовываете скрипт
Добавьте в конце ссылки на загружаемый файл скрипта
chat.js?2

Без смены имени, скрипт не подгружается - а используется кешированная версия

Spark 20.07.2012 00:50

Deff,
попробавал почистить кеш в браузере, да вы действительно правы. Последний вариант работает!

Deff 20.07.2012 01:01

Цитата:

Сообщение от Spark
да вы действительно правы.

Можно вместо моей этой ссылки http://s1.uploads.ru/i/ISFrd.gif (это пиксельная прозрачка)
Поставить миникартинку -уведомление - "недопустимые ссылки" или ругательный смайлик

Spark 20.07.2012 01:22

это я уже сам понял, и уже поставил. Спасибо вам огромное!

Aetae 20.07.2012 01:32

Пи*ц. Больному туберкулёзом зашили рот, и типа нормально. А чО: не кашляет, других не заражает...

Deff 20.07.2012 01:35

Aetae,
Гы - критик, сплошной - а где Вы были, кады я хоть криво - но помогал 17 часов не спамши ?

Aetae 20.07.2012 01:48

А смысл? Если вылетает "у всех", то проблема со стороны сервера в любом случае. Толку никакого.

Deff 20.07.2012 01:53

Aetae,
Та вылетает у Всех - но на клиенте - не после отдачи серву

Spark 20.07.2012 01:54

Aetae,
Ну от ваших постов тем более никакого.
Deff, Решил проблему, незнаю че вам не нравится, теперь никто не вылетает

devote 20.07.2012 02:04

Цитата:

Сообщение от Spark
Решил проблему, незнаю че вам не нравится, теперь никто не вылетает

зато тот кто захочет что бы вылетали, легко это осуществит, и скрипты вам не помогут.

PS. А создатель чата странный, нашел какой совет дать.

Deff 20.07.2012 02:05

Ващет Aetae, в словах есть правда - тут нун по хорошему и тут и там делать правки: клиентcкий скрипт не должен выводить картинку в чат без сервера, а, серв не должен выпускать это изо, на клиента, - но это имхо не дело правки тут - скрипт автора -пущай Он и правит

Spark 20.07.2012 02:06

devote,
Ну а конкретно, как он это осуществит, и как это решается?

devote 20.07.2012 02:13

Цитата:

Сообщение от Spark
Ну а конкретно, как он это осуществит, и как это решается?

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


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