Thứ Năm, 22 tháng 4, 2010

Security sandbox violation

Nhờ admin xem giùm:

- Upload ảnh xong không thấy hiện ra gì?

Khi viết flash application, bạn có thể gặp lỗi sau:
Error #2048: Security sandbox violation:...swf cannot load data from...

Với flash phiên bản mới hiện nay, lỗi trên có thể gặp ngay cả khi flash lấy dữ liệu từ cùng domain (vd: trường hợp flash lấy dữ liệu qua socket).
Định nghĩa file cross-domain policy file của adobe:

workflow


Như vậy flash từ domain a.com muốn lấy dữ liệu của b.com thì phải được b.com cho phép. Thông thường  file cross-domain-policy.xml được  đặt ở root của b.com.

Policy file xác định loại dữ liệu, xác  định các domain được phép truy cập.

Trường hợp socket server hosts policy file: Trong trường hợp flash a.com lấy dữ liệu qua socket với server b.com, mỗi khi lấy dữ liệu, flash sẽ gửi một single node XML document chứa <policy-file-request /> tới server. Socket server sẽ trả về policy file cần thiết về flash, flash dựa vào đó để xác định tiếp tục được lấy dữ liệu, hay đóng kết nối. Adobe dành cổng 843 làm cổng mặc định để flash gửi request và lắng nghe policy file trả về.  Do đó mỗi khi có request từ flash với server, nếu ở server lắng nghe ở cổng 843 sẽ nhận được dòng "<policy-file-request />" nói trên.

Dưới đây là một mẫu code policy server nhặt được trong dự án game tá lả (có vấn đề đâu không chịu tránh nhiệm , có gì thì cứ đè đại ka ra ;)) )

Viết bằng 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.

Cái này bằng python:
#!/usr/bin/env python
#
# flashpolicyd.py
# Simple socket policy file server for Flash
#
# Usage: flashpolicyd.py [--port=N] --file=FILE
#
# Logs to stderr
# Requires Python 2.5 or later

from __future__ import with_statement

import sys
import optparse
import socket
import thread
import exceptions
import contextlib

VERSION = 0.1

class policy_server(object):
def __init__(self, port, path):
self.port = port
self.path = path
self.policy = self.read_policy(path)
self.log('Listening on port %d\n' % port)
try:
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
except AttributeError:
# AttributeError catches Python built without IPv6
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
# socket.error catches OS with IPv6 disabled
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(('', port))
self.sock.listen(5)
def read_policy(self, path):
with file(path, 'rb') as f:
policy = f.read(10001)
if len(policy) > 10000:
raise exceptions.RuntimeError('File probably too large to be a policy file',
path)
if 'cross-domain-policy' not in policy:
raise exceptions.RuntimeError('Not a valid policy file',
path)
return policy
def run(self):
try:
while True:
thread.start_new_thread(self.handle, self.sock.accept())
except socket.error, e:
self.log('Error accepting connection: %s' % (e[1],))
def handle(self, conn, addr):
addrstr = '%s:%s' % (addr[0],addr[1])
try:
self.log('Connection from %s' % (addrstr,))
with contextlib.closing(conn):
# It's possible that we won't get the entire request in
# a single recv, but very unlikely.
request = conn.recv(1024).strip()
if request != '<policy-file-request/>\0':
self.log('Unrecognized request from %s: %s' % (addrstr, request))
return
self.log('Valid request received from %s' % (addrstr,))
conn.sendall(self.policy)
self.log('Sent policy file to %s' % (addrstr,))
except socket.error, e:
self.log('Error handling connection from %s: %s' % (addrstr, e[1]))
except Exception, e:
self.log('Error handling connection from %s: %s' % (addrstr, e[1]))
def log(self, str):
print >>sys.stderr, str

def main():
parser = optparse.OptionParser(usage = '%prog [--port=PORT] --file=FILE',
version='%prog ' + str(VERSION))
parser.add_option('-p', '--port', dest='port', type=int, default=843,
help='listen on port PORT', metavar='PORT')
parser.add_option('-f', '--file', dest='path',
help='server policy file FILE', metavar='FILE')
opts, args = parser.parse_args()
if args:
parser.error('No arguments are needed. See help.')
if not opts.path:
parser.error('File must be specified. See help.')

try:
policy_server(opts.port, opts.path).run()
except Exception, e:
print >> sys.stderr, e
sys.exit(1)
except KeyboardInterrupt:
pass

if __name__ == '__main__':
main()

Một ví dụ về policy file (không nên dùng :D)
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.example.com -->
<cross-domain-policy>
<!-- This is a master socket policy file -->
<site-control permitted-cross-domain-policies="all"/>
<!-- Instead of setting to-ports="*", administrator's can use ranges and commas -->
<allow-access-from domain="*" to-ports="*" />
</cross-domain-policy>

6 nhận xét:

  1. Thanks for good info :)

    Trả lờiXóa
  2. I want to express my thanks to this writer for bailing me out of this particular dilemma. As a result of checking through the the web and seeing basics which are not helpful, I assumed my life was over. Living without the approaches to the issues you have solved by way of this short post is a critical case, as well as the ones which may have badly damaged my career if I had not noticed your web site. Your expertise and kindness in taking care of a lot of stuff was useful. I'm not sure what I would've done if I had not come upon such a subject like this. I'm able to now look forward to my future. Thanks for your time so much for this high quality and effective help. I won't hesitate to propose the website to anybody who would like guide on this matter.

    Trả lờiXóa
  3. After study a few of the blog posts on your website now, and I truly like your way of blogging. I bookmarked it to my bookmark website list and will be checking back soon. Pls check out my web site as well and let me know what you think.

    Trả lờiXóa
  4. ... [Trackback]...

    [...] Read More: i-php.net/2010/04/security-sandbox-violation-trong-flash [...]...

    Trả lờiXóa
  5. Bệnh trào ngược dạ dày thực quản có gây ung thư không ?Hôi miệng là bệnh lý khá phổ biến, bệnh không nguy hiểm nhưng mang đến nhiều phiền tóa cho người bệnh
    Trào ngược dạ dày thực quản gây khó nuốtBởi vì nhiều bạn khi giao tiếp, nói chuyện cười đùa với bạn bè thì cảm thấy hơi thở của mình có mùi lạ, khó chịu, nhưng không biết có phải bệnh hôi miệng hay là do ảnh hưởng từ thức ăn.
    Trào ngược dạ dày thực quản gây đầy hơiHôi miệng không nguy hiểm đến tính mạng, nhưng nó thường khiến bệnh nhân khó chịu, mất tự tin khi giao tiếp.
    Trào ngược dạ dày thực quản gây đau họngTỏi là gia vị không thể thiếu trong các bữa ăn gia đình, nhưng việc ăn tỏi quá nhiều sẽ là nguyên nhân gây nên bệnh hôi miệng.
    Bệnh trào ngược dạ dày thực quản gây hôi miệngHôi miệng là bệnh mang lại nhiều ám ảnh cho người bệnh, chính mùi hôi bay ra từ miệng đã khiến người bệnh gặp phải rất nhiều khó khăn trong cuộc sống.
    Hở van dạ dày là dấu hiệu trào ngượcHành, tỏi, là gia vị khá quen thuộc giúp cho các món ăn trở nên ngon hơn, thơm hơn và đặc biệt rất tốt cho sức khỏe.
    Biến chứng của bệnh trào ngược dạ dày thực quảnBắt đầu qua tháng thứ 6, trẻ sẽ có dấu hiệu mọc răng sữa. Trước khi mọc răng, trẻ thường có dấu hiệu như chảy nước miếng thường xuyên, thích nhai cắn vật gì đó.
    Bệnh trào ngược dạ dày thực quản có chữa được không ?Tỳ Bách Thảo – sản phẩm Đông Y gia truyền được bào chế 100% từ thảo dược thiên nhiên không có chất bảo quản,

    Trả lờiXóa