<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.log2e.com &#187; Security</title>
	<atom:link href="http://blog.log2e.com/tag/security/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.log2e.com</link>
	<description>Tutorials and Code Snippets</description>
	<lastBuildDate>Mon, 01 Jun 2009 13:05:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>When a Cross-Domain Policy File is not Enough</title>
		<link>http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/</link>
		<comments>http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 13:03:25 +0000</pubDate>
		<dc:creator>Stefan Schmalhaus</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://blog.log2e.com/?p=87</guid>
		<description><![CDATA[This post is a reminder to myself (and a source of help to anyone who may need it). For a long time I thought a cross-domain policy file in a web server&#8217;s root directory solves all cross-domain security issues automagically &#8211; until I stumbled over the fact that I wasn&#8217;t able to manipulate the bitmap [...]]]></description>
			<content:encoded><![CDATA[<p>This post is a reminder to myself (and a source of help to anyone who may need it). For a long time I thought a cross-domain policy file in a web server&#8217;s root directory solves all cross-domain security issues automagically &#8211; until I stumbled over the fact that I wasn&#8217;t able to manipulate the bitmap data of an image that was loaded from outside my SWF file&#8217;s domain.</p>
<p><span id="more-87"></span></p>
<p>Let&#8217;s say you want to load a PNG file from &#8220;my.domain.com&#8221; into a SWF file on &#8220;your.domain.com&#8221;. Let&#8217;s also assume you have provided a &#8220;crossdomain.xml&#8221; file on &#8220;my.domain.com&#8221; that grants access to &#8220;your.domain.com&#8221;. As long as you only add an instance of the <code>flash.display.Loader</code> class to the display list everything is fine. But what if you, for example, want to access the bitmap data inside the loader object? In my case, I just wanted to set the <code>smoothing</code> property of the <code>Bitmap</code> object to <code>true</code> before resizing the image. So I tried this:</p>
<div class="geshi actionscript">
<ol>
<li class="li1">
<div class="de1">package</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">*</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">*</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">net</span>.<span class="me1">URLRequest</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">class</span> Main <span class="kw3">extends</span> Sprite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> loader:Loader = <span class="kw2">new</span> Loader<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loader.<span class="me1">contentLoaderInfo</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span> Event.<span class="me1">COMPLETE</span>, onComplete <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loader.<span class="kw3">load</span><span class="br0">&#40;</span> <span class="kw2">new</span> URLRequest<span class="br0">&#40;</span> <span class="st0">&quot;http://my.domain.com/image.png&quot;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> onComplete<span class="br0">&#40;</span> event:Event <span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> bitmap:Bitmap = event.<span class="kw3">target</span>.<span class="me1">loader</span>.<span class="me1">content</span> as Bitmap;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">smoothing</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">width</span> = bitmap.<span class="kw3">width</span> <span class="sy0">/</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">height</span> = bitmap.<span class="kw3">height</span> <span class="sy0">/</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addChild<span class="br0">&#40;</span> bitmap <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>This works fine inside the Flash CS3 IDE (or whatever IDE you use). I deployed the SWF file to a web server &#8211; and it failed. Why? Probably because I have missed to read this <a title="Creating More Secure SWF Web Applications" href="http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_print.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_print.html?referer=');">article</a>, this <a title="BitmapData/draw() and checkPolicyFile" href="http://www.toybot.nl/blog/?p=50" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.toybot.nl/blog/?p=50&amp;referer=');">blog post</a>, and this <a title="Enabling BitmapData.draw (..) on crossdomain images in Adobe Flash Player 9" href="http://www.abdulqabiz.com/blog/archives/flash_and_actionscript/enabling_bitmapdatad.php" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.abdulqabiz.com/blog/archives/flash_and_actionscript/enabling_bitmapdatad.php?referer=');">blog post</a>. And yes, I admittedly have never paid attention to the existence of the <a href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/LoaderContext.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/LoaderContext.html?referer=');">flash.system.LoaderContext</a> class. But this class is all what we need here (forget all the PHP proxy hacks, folks!).</p>
<p>Create a <code>LoaderContext</code> object with <code>checkPolicyFile</code> set to <code>true</code> and add it to the <code>flash.display.Loader</code>&#8216;s <code>load()</code> method!</p>
<div class="geshi actionscript">
<ol>
<li class="li1">
<div class="de1">package</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">display</span>.<span class="me1">*</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">events</span>.<span class="me1">*</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="me1">net</span>.<span class="me1">URLRequest</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">import</span> flash.<span class="kw3">system</span>.<span class="me1">LoaderContext</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">public</span> <span class="kw2">class</span> Main <span class="kw3">extends</span> Sprite</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">public</span> <span class="kw2">function</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> loaderContext:LoaderContext = <span class="kw2">new</span> LoaderContext<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loaderContext.<span class="me1">checkPolicyFile</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> loader:Loader = <span class="kw2">new</span> Loader<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loader.<span class="me1">contentLoaderInfo</span>.<span class="me1">addEventListener</span><span class="br0">&#40;</span> Event.<span class="me1">COMPLETE</span>, onComplete <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loader.<span class="kw3">load</span><span class="br0">&#40;</span> <span class="kw2">new</span> URLRequest<span class="br0">&#40;</span> <span class="st0">&quot;http://my.domain.com/image.png&quot;</span> <span class="br0">&#41;</span>, loaderContext <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">private</span> <span class="kw2">function</span> onComplete<span class="br0">&#40;</span> event:Event <span class="br0">&#41;</span>:<span class="kw3">void</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">var</span> bitmap:Bitmap = event.<span class="kw3">target</span>.<span class="me1">loader</span>.<span class="me1">content</span> as Bitmap;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">smoothing</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">width</span> = bitmap.<span class="kw3">width</span> <span class="sy0">/</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bitmap.<span class="kw3">height</span> = bitmap.<span class="kw3">height</span> <span class="sy0">/</span> <span class="nu0">2</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addChild<span class="br0">&#40;</span> bitmap <span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s easy when you know it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.log2e.com/2008/08/15/when-a-cross-domain-policy-file-is-not-enough/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>
