|
Запретить символ в УРЛ-ах
Есть уязвимость в 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 |
проверять на эту регулярку перед отправкой сообщения,если есть совпадение -не отправлять
/\/chat\/exit\.php\?img=exit\.jpg/ |
попробуйте поменять эту строку:
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) (*Поправил |
Цитата:
|
кроме .jpg другие форматы также приводят к вылету ,естественно. Думаю Deff близок к истине, однако чтото не так
|
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,
Там фигня в том что подгружаемый URL картинки = не картинка = а HTML cтраница( это защита хостингов картинок хранения для выдачи рекламы - тут вродь сервер чата не причем? Ну кнешн можно переваивать скрипт на парсинг картинок сервером - а не на клиенте |
Deff,
всё равно вылетает. Причем вообще не важно какой формат написан после точки, щас проверил |
В чем заключается уязвимость то? Как она влияет на скрипты?
|
Часовой пояс GMT +3, время: 14:28. |
|