Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > amesqit

Рейтинг: 4.50. Голосов: 2.

Двоеточие в протоколонезависимом URL

Запись от amesqit размещена 09.10.2015 в 13:24
Обновил(-а) alexcon314 02.11.2015 в 09:35

Возможно проблема распространенная, однако упоминаний о ней не нашел, поэтому решил поделиться с вами, уважаемые коллеги.
Суть проблемы в том, что если запросить данные из протоколонезависимого url содержащего двоеточие, то вернется ошибка безопасности Error #2048: Security sandbox violation без запроса самого crossdomain.xml.
Судя по всему при анализе строки для определения протокола используется отсечение по двоеточию, после чего принимается решение о том поддерживается ли протокол и генерируется ошибка.
Для демонстрации взял кроссдомейн от поставщика рекламы, поэтому если включен адблок, то его необходимо отключить. Вот самый простой пример:
Код AS3:
package
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.events.ErrorEvent;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    public class Main extends Sprite 
    {
        private var txt:TextField;
 
        public function Main() 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            stage.align     = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
 
            txt             = new TextField();
            txt.width       = stage.stageWidth
            txt.multiline   = true;
            txt.autoSize    = TextFieldAutoSize.LEFT
            txt.setTextFormat(new TextFormat("Tahoma",12,0));
            addChild(txt);
 
            var urlloader   :URLLoader  = new URLLoader();
            urlloader.addEventListener(Event.COMPLETE, completeLoadHandler);
            urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorEventHandler);
            urlloader.addEventListener(IOErrorEvent.IO_ERROR, errorEventHandler);
            //urlloader.load(new URLRequest("http://adv.gpm-digital.com/crossdomain.xml"));         //Вариант 1 Все хорошо
            //urlloader.load(new URLRequest("//adv.gpm-digital.com/crossdomain.xml"));              //Вариант 2 Все хорошо
            //urlloader.load(new URLRequest("http://adv.gpm-digital.com/crossdomain.xml?a=1:1"));   //Вариант 3 Все хорошо
            urlloader.load(new URLRequest("//adv.gpm-digital.com/crossdomain.xml?a=1:1"));          //Вариант 4 Ошибка
        }
 
        private function errorEventHandler(e:ErrorEvent):void 
        {
            toConsole(e.text)
        }
 
        private function completeLoadHandler(e:Event):void 
        {
            toConsole(e.target.data)
        }
 
        private function toConsole(message:String):void
        {
            txt.text = message;
        }
    }
}
Вариант 1 Протоколозависимый путь, без двоеточия. Все хорошо.[Вложение #500 - не найдено]
Вариант 2 Протоколонезависимый путь, без двоеточия. Все хорошо.[Вложение #501 - не найдено]
Вариант 3 Протоколозависимый путь, с двоеточием. Все хорошо.[Вложение #502 - не найдено]
Вариант 4 Протоколонезависимый путь, с двоеточием. Ошибка.[Вложение #503 - не найдено]

[Вложение #507 - не найдено]
Досадно, что необходимо самостоятельно определять и подставлять протокол, если есть вероятность встретить в ссылке двоеточие.
Всего комментариев 15

Комментарии

Старый 14.10.2015 01:25 AlexCooper вне форума
AlexCooper
 
Аватар для AlexCooper
Полезно.
Ошибка только с двоеточием? Не пробывали другие символы?
Старый 14.10.2015 01:57 amesqit вне форума
amesqit
 
Аватар для amesqit
Прочие символы не пробовал, но очень похоже на анализ протокола взаимодействия при загрузке, до определения портоколозависимости ссылки. Других проблем для блокирования запроса и возврата ошибки безопасности, без запроса crossdomain, не вижу. Наткнулся на саму проблему при ссылке вида //domain.com/aaa:bbb/video.m3u8 и стал искать откуда ноги растут.
Старый 14.10.2015 03:42 AlexCooper вне форума
AlexCooper
 
Аватар для AlexCooper
Код AS3:
escape(url)
должен помочь, вместо определения протокола
Старый 14.10.2015 13:33 amesqit вне форума
amesqit
 
Аватар для amesqit
Если рассматривать общий случай, когда внутри будет протоколозависимая ссылка, или будет с параметрами, это не поможет. С ссылкой надо проделывать достаточно большое количество манипуляций, чтобы закрыть эту проблему наверняка, отдельно с запросом, отдельно с параметрами, хотя причин для беспокойства казалось бы нет. Чуть позже добавлю функцию которая закрывает эту проблему.
Старый 14.10.2015 14:54 amesqit вне форума
amesqit
 
Аватар для amesqit
Вот собственно функция, в ней так же приходится самостоятельно парсить параметры на случай параметров вида //domain.com/script?a&b=1 т.к. URLVariables их просто так не проглотит в конструкторе.
Код AS3:
private function updateURL(value:String):String 
{
    //Проверка на протоколозависимость 
    var protocol:String = value.split("//")[0];
    if (protocol == "")
    {
        var arPath:Array = value.split("?");
        if (arPath.length > 1)
        {
            //Модификация урла c параметрами
            var url             :String         = escape(arPath.shift());
            var urlVAriables    :URLVariables   = new URLVariables()
            var arParameters    :Array          = arPath.join("?").split("&");
            var length          :uint           = arParameters.length;
            for (var i:int = 0; i < length; i++) 
            {
                //Пропускаем отсутствующие параметры, если встретим в ссылке &&
                if (arParameters[i] != "")
                {
                    var arValue :Array              = arParameters[i].split("=");
                    //Если нет значения параметра, подставляем пустую строку
                    urlVAriables[arValue.shift()]   = (arValue.length > 0) ? arValue.join("=") : "";
                }
            }
            return url + "?" + urlVAriables.toString();
        }
        else
        {
            //Модификация урла без параметров
            return escape(value)
        }
    }
    return value
}
Старый 14.10.2015 15:33 Tails вне форума
Tails
 
Аватар для Tails
Тоже спотыкался об эти идиотские грабли. Сейчас всегда самостоятельно определяю протокол из loaderInfo.url.
Всего одно условие, не так страшно.

Для работы с url'ами уже есть решение:
http://help.adobe.com/en_US/FlashPla...s/URLUtil.html
Старый 14.10.2015 15:59 amesqit вне форума
amesqit
 
Аватар для amesqit
Я так же решил проблему у себя, т.к. нужно было сделать все очень срочно. loaderInfo.url хорош своей простотой, но передавать урл или протокол, без серьезных на то причин не экранному объекту не очень хорошо, особенно если этого можно не делать.
Старый 14.10.2015 16:12 Tails вне форума
Tails
 
Аватар для Tails
Можно сделать статик класс со свойством. Никуда ничего передавать не нужно будет.
Старый 14.10.2015 16:35 kemsky вне форума
kemsky
мб. encodeURIComponent?
Цитата:
Another important difference between this function and encodeURI() is that because this function assumes that it is processing a URI component it treats the special separator characters (; / ? : @ & = + $ , #) as regular text that should be encoded.
Старый 14.10.2015 17:25 amesqit вне форума
amesqit
 
Аватар для amesqit
Tails, это уже подробности, в обоих вариантах есть свои плюсы и минусы, протокол из loaderInfo.url по-моему самый очевидный вариант и самый быстрый в реализации, мне просто не нравится, что для него берутся данные из-за границы класса, в котором нужна модификация ссылки. Вышеописанную функцию в использовании тоже имеет смысл сделать статичной.
kemsky, encodeURIComponent как раз не подходит, так же как и encodeURI, т.к. encodeURIComponent будет экранировать "/", а encodeURI не будет экранировать ":", согласно таблиц "Символы, которые не кодируются" в описании функций ссылка
Старый 15.10.2015 03:06 AlexCooper вне форума
AlexCooper
 
Аватар для AlexCooper
Так же можно ловить security_error в кастомном загрузчике, и после проверять не протокол ли, тем самым парсить строку только в случае ошибки.
Старый 15.10.2015 12:41 amesqit вне форума
amesqit
 
Аватар для amesqit
Если б URLRequest не был бы зафинален, можно было бы его расширить, но тут не судьба. В любом случае со сторонними библиотеками это не очень удобно.
Старый 15.10.2015 21:28 AlexCooper вне форума
AlexCooper
 
Аватар для AlexCooper
В любом случае метод updateURL подтягиваете. Я лично, давно использую свой загрузчик унаследованный от URLLoader
Старый 16.10.2015 13:05 amesqit вне форума
amesqit
 
Аватар для amesqit
Про сторонние библиотеки я имел в виду swc, где уже ничего не изменить, да и вообще не люблю вносить изменения в чужой код, если он работает. Со своими велосипедами всегда приятнее и удобнее работать, но в чужих далеко не всегда хочется разбираться, даже если они в чем-то лучше.
Старый 05.11.2015 21:14 alexcon314 вне форума
alexcon314
Прошу прощения невнимательность. Эта запись в блоге amesqit была удалена мной по недоразумению.
 
Последние записи от amesqit

 


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


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.