Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Ошибка безопасности (http://www.flasher.ru/forum/showthread.php?t=207954)

Anabel 21.05.2014 01:39

Ошибка безопасности
 
Добрый вечер! Стоит задача разработать онлайн чат для сайта. Пребегли к помощи бинарных сокетов. Но в флеше нужно дать отачу файла безопасности, дабы не было ошибки "[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]"
Вот сам файл, написанный на perl:
Код:

    #!/usr/bin/perl
    #
    # policyd.pl
    # Simple socket policy file server
    #
    # Usage: policyd.pl [-port=N] -file=FILE
    # Logs to stdout
    #
   
    use strict;
    use Socket;
   
    my $NULLBYTE = pack( 'c', 0 );
   
    my $port = 843;
    my $filePath;
    my $content;
   
    ### READ ARGS
   
    while ( my $arg = shift @ARGV )
    {
        if ( $arg =~ m/^--port=(\d+)$/ )
        {
            $port = $1;
        }
        elsif ( $arg =~ m/^--file=(.*)/ )
        {
            $filePath = $1;
        }
    }
   
    unless ( $filePath )
    {
        die "Usage: policyd.pl [--port=N] --file=FILE\n";
    }
   
    ### READ FILE
   
    -f $filePath or die "No such file: '$filePath'\n";
    -s $filePath < 10_000 or die "File probably too large to be a policy file: '$filePath'\n";
   
    local $/ = undef;
    open POLICYFILE, "<$filePath" or die "Can't open '$filePath': $!\n";
    $content = <POLICYFILE>;
    close POLICYFILE;
   
    $content =~ m/cross-domain-policy/ or die "Not a valid policy file: '$filePath'\n";
   
    ### BEGIN LISTENING
   
    socket( LISTENSOCK, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ) ) or die "socket() error: $!";
    setsockopt( LISTENSOCK, SOL_SOCKET, SO_REUSEADDR, pack( 'l', 1 ) ) or die "setsockopt() error: $!";
    bind( LISTENSOCK, sockaddr_in( $port, INADDR_ANY ) ) or die "bind() error: $!";
    listen( LISTENSOCK, SOMAXCONN ) or die "listen() error: $!";
   
    print STDOUT "\nListening on port $port\n\n";
   
    ### HANDLE CONNECTIONS
   
    while ( my $clientAddr = accept( CONNSOCK, LISTENSOCK ) )
    {
        my ( $clientPort, $clientIp ) = sockaddr_in( $clientAddr );
        my $clientIpStr = inet_ntoa( $clientIp );
        print STDOUT "Connection from $clientIpStr:$clientPort\n";
     
        local $/ = $NULLBYTE;
        my $request = <CONNSOCK>;
        chomp $request;
   
        if ( $request eq '<policy-file-request/>' )
        {
            print STDOUT "Valid request received\n";
        }
        else
        {
            print STDOUT "Unrecognized request: $request\n\n";
            close CONNSOCK;
            next;
        }
   
        print CONNSOCK $content;
        print CONNSOCK $NULLBYTE;
        close CONNSOCK;
   
        print STDOUT "Sent policy file\n\n";
    }
   
    # End of file.

Но ошибка не пропадает. Можете подсказать, что не так?

caseyryan 21.05.2014 08:15

А где содержимое самого файла политик?

Anabel 21.05.2014 10:05

Это он и есть

caseyryan 21.05.2014 10:22

Это не он. Кто вообще писал этот скрипт?

В перл не силен, но тут и перл знать не надо, чтобы понять, что ссылка на файл политик должна выделяться из переданных аргументов с помощью регулярного выражения вот здесь:
Код:

while ( my $arg = shift @ARGV )
    {
        if ( $arg =~ m/^--port=(\d+)$/ )
        {
            $port = $1;
        }
        elsif ( $arg =~ m/^--file=(.*)/ )
        {
            $filePath = $1;
        }
    }

Значит сам файл должен физически храниться в какой-то директории.

alexcon314 21.05.2014 10:43

Приведенный перл-скрипт не что иное, как реализация на перле простейшего сокет-сервера (вполне себе достойная реализация, нужно отметить).
При запуске этого скрипта на сервере создается сокет, слушающий определенный порт (843 по умолчанию) и при коннекте на него клиенту отдается содержимое файла политик безопасности.
Т.е. что нужно:
- создать собственно сам файл политик (формат файла см. в справке адоба)
- положить этот файл в какую-либо директорию на сервере
- запустить на сервере скрипт "policyd.pl --port=843 --file=<путь_к _файлу_политик>" и убедиться, что запустился он без ошибок
- и только после этого пытаться запустить флешку на клиенте

Полезно в момент запуска флешки на клиенте смотреть на сервере консольный вывод запущенного скрипта.

Anabel 21.05.2014 16:09

Вы имеете ввиду вот этот файл?
Код:

    <?xml version="1.0"?>
    <!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
    <cross-domain-policy>
      <site-control permitted-cross-domain-policies="master-only"/>
      <allow-access-from domain="*" to-ports="*" />
    </cross-domain-policy>


alexcon314 21.05.2014 16:22

Мы - да.

Anabel 21.05.2014 17:33

Значить файл есть. Почему тогда есть ошибка? Может для ответа нужна дополнительная информация - спрашивайте, всё расскажу.

caseyryan 21.05.2014 17:45

Расставьте промежуточный вывод. Проверьте записывается ли содержимое этого файла в переменную. И, кстати, флешплеер точно стучится туда с запросом файла политик?

Anabel 21.05.2014 18:48

Код AS3:

Security.loadPolicyFile("xmlsocket://" + Main.HOST + ":843");

При локальном запуске этой ошибки нет. Только на сервере. Значит ли это, что на сервере не хватает какой-то программы?

alexcon314 21.05.2014 23:33

Вот когда начинают мешать в одну кучу "локально", "на сервере" лично у меня случается split-brain.
Давайте так, вы подробно опишете порядок ваших действий, типа компилю флешку, загружаю ее на сервер вместе с html-страницей, куда она встроена, открываю страницу с флешкой в браузере, перл-скрипт запустиь на сервере не забыл, он вывел в консоль такие вот строки и т.п, и приведете пример кода флешки, где вылазит ошибка. Потом, loadPolicyFile применять как бы нужно по назначению, например, если файл политик отдается на другом порту, отличном от дефолтного 843 порта. Вам loadPolicyFile ни к чему.

Anabel 21.05.2014 23:43

Вот что:
отдачу файла политики на 843 должен запустить файл zapusk.sh (написанный на ShellScript). При запуске файла /zapusk.sh сервер выводит информацию Listening on port 843. Тут же, не закрывая окно putty, проверка ps -A - ничего не запущено на 843 порту. Вот из-за этой фишки то и не работает адекватно. Как её можно решить?

caseyryan 21.05.2014 23:50

Так в линуксе для запуска хоть чего на порту ниже 1024 нужны права рута. Права то точно суперпользователя? Может без должных привилегий запускается скрипт?
Попробуйте другой порт, скажем 12000 туда поставить, и, соответственно во флешке запросить файл политик с этого порта

Anabel 21.05.2014 23:57

В том-то и дело, что я пользуюсь пользователём root. И если бы не было прав root-а, то разве выводило б Listening on port 843?

P.S. вот код zapusk.sh:
Код:

perl /policyd.pl --file=/policy.xml --port=843 &
P.S.S Нет, не помогло.

P.S.S.S. Хотя, я беру свои слова назад. Помогло. Первый раз после перезагрузки видать из кеша данные взялись. Работает. Хотя, почему не подключается на 843-й? Ведь у меня права рута были?!

alexcon314 22.05.2014 00:19

Цитата:

ps -A
Эта команда не выводит слушаемые порты. Нужно netstat -l. Рут нужен, да. Потом, меня смутило "не закрывая окно путти". Вы часом скрипт не прибиваете через Ctrl+C, чтобы команду ps запустить?

UPD. пардон, не заметил & в команде запуска. Все нормально должно быть.

caseyryan 22.05.2014 07:47

Цитата:

Хотя, почему не подключается на 843-й? Ведь у меня права рута были?!
Я вот сколько серверов использовал, там никогда 843 порт не слушался по умолчанию. И это вполне логично. Если все будут использовать порт по умолчанию, то при запуске другого приложения оно может банально отвалиться из-за конфликта портов.
Цитата:

Первый раз после перезагрузки видать из кеша данные взялись.
Я на этот случай делаю примерно так:
там, где у меня передается ссылка на флеш ролик в SWFObject, я просто к ссылке добавляю рандомный параметр
Код AS3:

var rand = String(Math.floor(Math.random() * 100000));
"someMovie.swf?" + rand

и ничего из кэша не берется уже


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

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