<?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>_nec &#187; eval</title>
	<atom:link href="http://nec.shell8.net/tag/eval/feed/" rel="self" type="application/rss+xml" />
	<link>http://nec.shell8.net</link>
	<description>webfejlesztés, front-end programozás, javascript, css, xhtml, ajax, air</description>
	<lastBuildDate>Wed, 31 Aug 2011 06:54:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Eval() Adobe AIR -ben?</title>
		<link>http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/</link>
		<comments>http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 08:15:01 +0000</pubDate>
		<dc:creator>_nec</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[eval]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[workaround]]></category>

		<guid isPermaLink="false">http://nec.shell8.net/?p=125</guid>
		<description><![CDATA[Leggyakrabban talán JSON stringek objektumokká alakításakor jön elő ez a probléma. Az Adobe AIR környezet biztonsági okokból korlátozza az eval() javascript metódust. Ez a szigor erősen indokolt, de nem okoz megoldhatatlan problémát. Nézzük a megoldást, de előbb az okokat, amiért így lett kialakítva a futtatókörnyezet. Valamit valamiért, avagy amiért nincs eval(). MIt csinál az eval()? [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-140 noborder" title="air_vent" src="http://nec.shell8.net/wp-content/uploads/2008/10/air_vent.jpg" alt="" width="240" height="130" />Leggyakrabban talán JSON stringek objektumokká alakításakor jön elő ez a probléma. Az Adobe AIR környezet biztonsági okokból korlátozza az <em><a href="http://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Functions/eval">eval()</a></em> javascript metódust. Ez a szigor erősen indokolt, de nem okoz megoldhatatlan problémát.</p>
<p>Nézzük a megoldást, de előbb az okokat, amiért így lett kialakítva a futtatókörnyezet.</p>
<p><span id="more-125"></span><strong>Valamit valamiért, avagy amiért nincs eval().</strong></p>
<p>MIt csinál az eval()? Végrehajt egy string formában megadott javascript kódsort, minden előztetes cécó nélkül.</p>
<p>Az AIRből pedig kivették azt a biztonsági szigorítást, hogy AJAX kérések csak azon a domainen futhatnak, ahol az oldal amit látogatunk. Bárhonnan fogadhatunk akármilyen javascript kódokat, akár fileszinten is betáplálva az alkalmazásunkba.</p>
<p>Ez eléggé hasznos, révén így igazi, online forrásokra támaszkodó, nyitott API-kat nyújtó webszolgáltatásokat kihasználó alkalmazást alkothatunk. De veszélyeket is rejt, révén az AIR alkalmazásunk hozzáfér a kliens filerendszeréhez. Nem lenne túl jó, ha egy pl egy chatprogram evalozott JSON stringjeiben tudatlanul kiadnánk személyesebb adatokat tartalmazó fájljainkat.</p>
<p>Az alkalmazásunk egy izolált környezetben fut, angol nevén ez a <em>sandbox</em>. Ezen belül vezették be az Adobe fejlesztői az alábbi szigorításokat:</p>
<ul>
<li><strong>eval() futtatások</strong> csak az onLoad előtt működnek</li>
<li><strong>szinkron XMLHttpRequests</strong> kérések onLoad előtt nem adnak választ, <strong>aszinkron XMLHttpRequests</strong> kéréseket el lehet küldeni onLoad előtt, de azok válasza csak onLoad után érkezhet meg</li>
<li>onLoad után a <strong>document.write()</strong> és a <strong>document.writeln()</strong> függvények nem kerülnek lefutásra</li>
<li>htmlből hivatkozva <strong>scripteket</strong> nem lehet <strong>betölteni </strong>a <em>sandbox</em>-on <strong>kívülről</strong></li>
<li>dinamikusan létrehozott <strong>&lt;script&gt; elemek</strong> nem kerülnek lefutásra.</li>
</ul>
<p> <br />
<strong>Karantén, avagy a non-application sandbox</strong></p>
<p>Lehetőségünk van több ilyen <em>sandbox</em>-ot létrehozni, hogy ne akadjanak össze esetleg a használt rendszerek. Ezekben a &#8220;karanténokban&#8221; ismét visszakapjuk az eval()-t, újra megvan a domainre vonatkozó szigor, de semmit se láthatunk magából az AIR futtatókörnyezetből.</p>
<p>Ezeket például IFRAME -ek segítségével valósíthatjuk meg, az alkalmazás html kódjába helyezve valami hasonlót:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;">	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;iframe</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;frameId&quot;</span></span>
<span style="color: #009900;">		<span style="color: #000066;">sandboxRoot</span>=<span style="color: #ff0000;">&quot;http://plurk.com/&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">documentRoot</span>=<span style="color: #ff0000;">&quot;app:/&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;nonapp_sandbox.html&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">frameborder</span>=<span style="color: #ff0000;">&quot;0&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">height</span>=<span style="color: #ff0000;">&quot;0&quot;</span> </span>
<span style="color: #009900;">		<span style="color: #000066;">width</span>=<span style="color: #ff0000;">&quot;0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/iframe<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>ID &#8211; amivel majd DOMon keresztül hivatkozunk rá<br />
sandboxRoot &#8211; az a domain amire a karanténon belül szűkítjük a lekéréseket<br />
documentRoot &#8211; amennyiben ez &#8220;app:/&#8221;, akkor kapunk megfelelő <em>non-application sandbox</em> -ot<br />
src &#8211; a html amit betöltünk majd az IFRAME-be</p>
<p><img class="alignnone size-full wp-image-136" title="Air Application Sandboxes" src="http://nec.shell8.net/wp-content/uploads/2008/10/air_abra.jpg" alt="" width="500" height="235" /></p>
<p>Most, hogy van egy szeparált környezetünk, ahol működik az <em>eval(),</em> már csak össze kell kötni a két <em>sandbox</em>-ot. Ezt az AIR egy <em><strong>childSandboxBridge </strong></em>nevű interfészen keresztül tudja megvalósítani.</p>
<p>Az IFRAME-be dugott htmlben hozzunk létre pár függvényt. Először definiálni kell mit akarunk az IFRAME-en kívülre adni a childSandboxBridge-en keresztül.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">	<span style="color: #009966; font-style: italic;">/* nonapp_sandbox.html */</span>
	window.<span style="color: #000066;">onLoad</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>		    
		window.<span style="color: #660066;">childSandboxBridge</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">'myEval'</span><span style="color: #339933;">:</span> myEval<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>			
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Majd definiáljuk magát a függvényt amit átadunk.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>4
5
6
7
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">	<span style="color: #009966; font-style: italic;">/* nonapp_sandbox.html */</span>
	<span style="color: #003366; font-weight: bold;">function</span> myEval<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">eval</span><span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Tehát maga az eval() ebben a zárt környezetben fut le, a végeredményt adja át az alkalmazásnak. Bármi ártalmas kód ami itt végrehajtódik, próbálhozhat, nem fér hozzá az AIR környezethez, s azon keresztül a rendszerhez.</p>
<p>Az alkalmazásunkban onLoad eseménykor definiáljuk a childSandboxBridge interfészen át kapott függvényt.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">	<span style="color: #009966; font-style: italic;">/* application.html */</span>
	window.<span style="color: #000066;">onLoad</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		window.<span style="color: #660066;">myEval</span> <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'frameId'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">contentWindow</span>.<span style="color: #660066;">childSandboxBridge</span>.<span style="color: #660066;">myEval</span><span style="color: #339933;">;</span>		
	<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>És ennyi, most már használhatjuk eval helyett ezt a saját függvényt. Még kényelmesebb, ha pl az általunk használt javascript keretrendszer érzékenyebb részeit módosítjuk úgy, hogy működjenek ezen az interfészen keresztül, és akkor későbbiekben már észre se vesszük ezt a problémát.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>10
11
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">	<span style="color: #009966; font-style: italic;">/* application.html */</span>
	<span style="color: #003366; font-weight: bold;">var</span> evaledCode <span style="color: #339933;">=</span> window.<span style="color: #660066;">myEval</span><span style="color: #009900;">&#40;</span> code_string <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p><strong>Eddig az Adobe AIR-ről:</strong></p>
<ul>
<li><a href="http://nec.shell8.net/2008/10/22/adobe-air-sqlite-javascript/">#6 SQLite JavaScriptből</a></li>
<li><a href="http://nec.shell8.net/2008/07/11/adobe-air-nativ-menukezeles/">#5 Natív menükezelés</a></li>
<li><a href="http://nec.shell8.net/2008/07/05/adobe-air-dragndrop-filefeltoltes/">#4 Drag’n&#8217;Drop és Filefeltöltés</a></li>
<li><a href="http://nec.shell8.net/2008/06/25/adobe-air-esemenyek">#3 Események</a></li>
<li><a href="http://nec.shell8.net/2008/06/23/adobe-air-ablakkezeles">#2 Ablakkezelés</a></li>
<li><a href="http://nec.shell8.net/2008/06/19/adobe-air-alapok">#1 Az alapok</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nec.shell8.net/2008/10/14/eval-adobe-air-ben/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

