Форум 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");

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


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

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