policy-file-requestの対処法

公開日: 

最新のFlash Playerでは、サーバーと通信するとき、\0(\0はNULL文字)という文字列を送信してきます。これに対して\0というような文字列を返してやらないと、まったく通信できません。
そこでその文字列を返す方法を探って見たところ、色々方法があったのでメモ。

sponcer link


1.rubyの場合
http://d.hatena.ne.jp/viver/20080421/p1
主な仕組みなどはここみれば大体わかるかな?
ついでにrubyバージョンの方法もあったのでメモ。

require ‘socket’
require ‘rexml/document’
if ARGV.empty?
puts “Usage: #{File.basename($0)}
exit 1
end
policy = File.read(ARGV[0]) + “\0”
REQUEST_LIMIT = 32
def log(addr, msg)
puts “#{addr} #{msg}”
end
srv = TCPServer.open(843)
while true
Thread.start(srv.accept) {|s|
port, addr = Socket.unpack_sockaddr_in( s.getpeername )
begin
log addr, “connection accepted”
buf = “”
begin
buf << s.sysread(REQUEST_LIMIT) raise "request too big" if buf.length > REQUEST_LIMIT
end until buf.include?(“\0”)
log addr, “received request #{buf.inspect}”
req = REXML::Document.new(buf)
unless req.root.name == “policy-file-request”
raise “invalid request”
end
log addr, “sending policy file”
s.write policy
rescue
log addr, “invalid request: #{$!.inspect}”
ensure
s.close
end
}
end

でも実際につかってみたら、

C:/ruby/socket.rb:16:in `‘: uninitialized constant TCPServer (Na
meError)
from c:/ruby/socket.rb:1:in `require’
from c:/ruby/socket.rb:1:in `

っていわれて使えなかったので使うのあきらめた。
PHPの場合
http://ammonlauritzen.com/blog/2007/12/13/new-flash-security-policies/
ここから引用

<?php
if( posix_getuid() != 0 ) // これはWindows環境では使えない関数なので、Windowsの場合はここを削除
die( “You must run this script as root.\n” );
$sock = @socket_create( AF_INET, SOCK_STREAM, SOL_TCP );
if( !$sock )
die( “Unable to create socket.\n” );
$succ = @socket_bind( $sock, “0.0.0.0”, 843 );
if( !$succ )
die( “Unable to bind to port 843.\n” );
$succ = @socket_listen( $sock );
if( !$succ )
die( “Unable to start listening.\n” );
while( true ) {
$r = $w = $e = array( $sock );
if( @socket_select( $r, $w, $e, null ) !== false ) {
$conn = @socket_accept( $sock );
if( $conn !== false ) {
socket_write( $conn, $policy_file );
socket_close( $conn );
} else {
echo “socket_accept() failed?\n”;
break;
}
} else {
echo “socket_select() failed?\n”;
break;
}
}
socket_close( $sock );

c:\php\php c:\www/socket.phpとコマンドプロンプトで実行しておくことでソケットをまちうけている状態にして、動作することができた。
Javaの場合

import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;
public class socket {
 public static final int ECHO_PORT = 843;
 public static void main(String args[]) {
  ServerSocket serverSocket = null;
  try {
   serverSocket = new ServerSocket(ECHO_PORT);
   System.out.println(“Serverが起動しました(port=” + serverSocket.getLocalPort() + “)”);
   while (true) {
    Socket socket = serverSocket.accept();
    new EchoThread(socket).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    if (serverSocket != null) {
     serverSocket.close();
    }
   } catch (IOException e) {
   }
  }
 }
}
class EchoThread extends Thread {
 private Socket socket;
 
 public EchoThread(Socket socket) {
  this.socket = socket;
  System.out.println(“接続されました ” + socket.getRemoteSocketAddress());
 }
 public void run() {
  try {
   BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
//   out.println(““);
   out.println(““);
  } catch (IOException e) {
   e.printStackTrace();
  } finally {
   try {
    if (socket != null) {
     socket.close();
    }
   } catch (IOException e) {}
   System.out.println(“切断されました ” + socket.getRemoteSocketAddress());
  }
 }
}

Javaだったら大体環境も容易されてるしで、実行しやすいかな?
Adobe Flash CS4 詳細!ActionScript3.0入門ノート[完全改訂版](CD-ROM付)
Adobe Flash CS4 Professional (V10.0) 日本語版 Windows版

  • このエントリーをはてなブックマークに追加
  • Pocket
PAGE TOP ↑