<?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"
	>

<channel>
	<title>Вовата, s. Hamaelleon ™ &#187; PHP</title>
	<atom:link href="http://www.vlkomarov.info/blog/category/web-development/php-web-development-2/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vlkomarov.info/blog</link>
	<description>Почти сериозен блог на една гола цица</description>
	<pubDate>Wed, 26 Nov 2008 19:51:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>It&#8217;s Show &#124;&#124; Race &#124;&#124; MicroTime</title>
		<link>http://www.vlkomarov.info/blog/2008/08/26/its-show-race-microtime/</link>
		<comments>http://www.vlkomarov.info/blog/2008/08/26/its-show-race-microtime/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 12:19:37 +0000</pubDate>
		<dc:creator>Hamaelleon</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web development]]></category>

		<category><![CDATA[Excel]]></category>

		<category><![CDATA[export]]></category>

		<category><![CDATA[import]]></category>

		<category><![CDATA[microtime]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[race]]></category>

		<category><![CDATA[showtime]]></category>

		<category><![CDATA[XML]]></category>

		<category><![CDATA[бъзик]]></category>

		<category><![CDATA[експорт]]></category>

		<category><![CDATA[импорт]]></category>

		<category><![CDATA[почивка]]></category>

		<category><![CDATA[състезание]]></category>

		<category><![CDATA[улеснение]]></category>

		<category><![CDATA[функционалност]]></category>

		<guid isPermaLink="false">http://www.vlkomarov.info/blog/?p=111</guid>
		<description><![CDATA[
Точно приключих с един експорт/импорт скрипт (export XLS - XML via PHP from MySQL Database / import Excel Spreadsheet as XLS - XML to MySQL DB) и съм почти доволен.. даже и работи  Остава и клиентите да го оценят. Ама като се замисли човек, ако имаме база данни с няколкостотин или хиляди продукта и [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/php-race.jpg" alt="Газ до ламарината :)" /></p>
<p>Точно приключих с един <strong>експорт/импорт скрипт</strong> (export XLS - XML via PHP from MySQL Database / import Excel Spreadsheet as XLS - XML to MySQL DB) и съм <em>почти</em> доволен.. даже и работи <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Остава и клиентите да го оценят. Ама като се замисли човек, ако имаме база данни с няколкостотин или хиляди продукта и се наложи да обновим ценовата листа, например, сещате ли се колко време ще е нужно за да се свърши това през админ панела, продукт по продукт, за всеки по няколко различни цени. Тегаво, a? Жестока досада! А така, експортваш шаблона (настоящата ценова листа), редактираш в Excel, каквото там е нужно, записваш като XML Spreadsheet, оп, качваш през админ панела файла и след <strong>няколко секунди</strong> цялата работа е свършена! Мммм, благинка. Та сега след като помогнахме на някой си някъде там да има повече време да се задява с колежките, да се позанимаем и ние с малко глупости. It&#8217;s showtime <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Оп, microtime(), обърках се <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-111"></span></p>
<p>Да ви преставя концепцията на състезанието:</p>
<p>Имаме две кучки бегачки, и двете са резачки (split). Задачата им ще е да отрежат главата на <em>мистър Файл</em> един милион пъти и да я върнат. Борим се за всяка милипунта, щот не можем да си позволим излишен разход на ценни милисекунди <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Първият състезател:</p>
<pre class="syntax-highlight:php">
function getExtByArrayMethod ($file, $allowableExtensions) {
$split = array_reverse(explode(&#039;.&#039;, $file));
if (in_array(strtolower($split[0]), $allowableExtensions)) {
return $ext = $split[0];
}
}
</pre>
<p>Той се състезава така: първо му го нацепва на <em>мистър Файл</em> по всяка негова чувствителна точка с explode(&#8217;.', $file), после го обръща у лево с array_reverse (виждате ли какви неща има в PHP-то!!!).  След това взема първото отсечено след обръщането, смалява го (strtolower) и проверява дали пасва на това, което търси (масив $allowableExtensions с разрешени файлови съкращения). Ако пасне го изплюва сдъвкано - и така един милион пъти <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Другата кучка:</p>
<pre class="syntax-highlight:php">
function getExtByStringMethod ($file, $allowableExtensions) {
$ext = strtolower(substr($file, strrpos($file, &#039;.&#039;) + 1));
if (in_array($ext, $allowableExtensions)) {
return $ext;
}
}
</pre>
<p>Туй говедо не ползва масиви, а третира <em>мистър Файл</em> като простоват низ (string). Първо нанюхва важната последна точка в низа чрез strrpos, и с 1 идея напред, с един удар реже остатъка. Смалява го, проверява дали пасва и ако да, го изплюва - и така един милион пъти.</p>
<p>Ето го семплото циклене:</p>
<pre class="syntax-highlight:php">
for ($i = 1; $i &lt; = ITR; $i++) {
getExtByArrayMethod(FILENAME, $allowableExtensions);
}
</pre>
<p>Тук имаме константи и един масив, които ще ползваме за състезанието:</p>
<pre class="syntax-highlight:php">
$allowableExtensions = array(&#039;avi&#039;, &#039;mpg&#039;, &#039;mp4&#039;,
&#039;mov&#039;, &#039;wmv&#039;, &#039;flv&#039;, &#039;mpeg&#039;, &#039;gp3&#039;,
&#039;vob&#039;, &#039;rm&#039;, &#039;txt&#039;, &#039;psd&#039;, &#039;exe&#039;);

define(&#039;FILENAME&#039;, &#039;video4560289703.public.gp3&#039;;);
define(&#039;ITR&#039;, 1000000);
</pre>
<p>Ползваме microtime() заедно с една полезна функцийка от php.net за превръщане на резултата в нещо лесно разбираемо и.. Старт! <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Begin getExtByArrayMethod: 1219751738.47<br />
End getExtByArrayMethod: 1219751748.79<br />
Result: <span style="color: #ff0000;">10.3256812096</p>
<p>Begin getExtByStringMethod: 1219751748.79<br />
End getExtByStringMethod: 1219751755.35<br />
Result: <span style="color: #ff0000;">6.55777096748</span></p>
<p>Както виждате при един милион итерации моята кучка бие тази на колегата с близо 4 секунди или цели 4000 милипунти, представяте ли си?! <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Колегата явно хич не го е*е за разхищаване на ценно процесорно време <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Извън кръга на майтапа и чуденката, работа с масиви или със стрингове за конкретното приложение.. нещо сериозно: никога не проверявайте при upload формуляр само за MIME Type на качваните файлове. Това е лесно заобиколимо препятствие и освен, ако не сте фенове да ви го хакват изотзаде, проверявайте винаги комбинирано и за MIME Type, и <em>за разширението на файла</em>, и за големината, и т.н., и т.н. Ама пак мое ви го хакнат, спасение няма <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>&#8212;</p>
<p>Ето го <a href="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/race.php.txt" target="_blank">тестовият файл</a>, можете да пробвате..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vlkomarov.info/blog/2008/08/26/its-show-race-microtime/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP Security - преглед на печата</title>
		<link>http://www.vlkomarov.info/blog/2008/08/17/php-security-books-review/</link>
		<comments>http://www.vlkomarov.info/blog/2008/08/17/php-security-books-review/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 18:22:44 +0000</pubDate>
		<dc:creator>Hamaelleon</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[books]]></category>

		<category><![CDATA[Cross-Site Scripting]]></category>

		<category><![CDATA[file upload]]></category>

		<category><![CDATA[PHP5]]></category>

		<category><![CDATA[Remote Execution]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[SQL Injection]]></category>

		<category><![CDATA[XSS]]></category>

		<category><![CDATA[книги]]></category>

		<category><![CDATA[сигурност]]></category>

		<guid isPermaLink="false">http://www.vlkomarov.info/blog/?p=101</guid>
		<description><![CDATA[И като продължение на темата от предишната публикация - сигурността при разработване на уеб приложения - кратък преглед на печата.

За съжаление, но и без да буди кой знае какво учудване, на български език за PHP Security има издадена само една книга: Essential PHP Security, Chris Shiflett, 2006. Българското издание е на издателска къща ЗеСТ Прес [...]]]></description>
			<content:encoded><![CDATA[<p>И като продължение на темата от предишната публикация - сигурността при разработване на уеб приложения - кратък преглед на печата.</p>
<p><a rel="lightbox[php-security-books]" href="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/pro-php-security.jpg" title="Pro PHP Security"><img src="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/pro-php-security-th.jpg" alt="Pro PHP Security" style="position: relative; float: right; margin-left: 15px;" /></a></p>
<p>За съжаление, но и без да буди кой знае какво учудване, на български език за PHP Security има издадена само една книга: <strong>Essential PHP Security, Chris Shiflett, 2006</strong>. Българското издание е на издателска къща ЗеСТ Прес от 2007, ISBN-13: 978-954-9341-20-1. Ако случайно все още не притежавате тези 120 страници в книжен формат, <a href="http://www.book.store.bg/c/p-p/m-514/id-17946/osnovi-na-php-sigurnostta-kris-shiflet.html" target="_blank">препоръчвам ви ги</a>. Книгата, макар и хубава, е прекалено малка и надали ще задоволи очакванията ви.. по-скоро е като вкусен залъгващ залък преди основното ястие.</p>
<p>Мисля, че сте попадали на поне една от тези три книги. Ако ли пък не, ето сега имате тази възможност:</p>
<p><strong>Pro PHP Security, Chris Snyder &amp; Michael Southwell, 2005</strong></p>
<p><span id="more-101"></span></p>
<p>ISBN (pbk): 1-59059-508-4<br />
Тези над 500 страници четиво определено си заслужават. Ето го съдържанието в кратък вариант:</p>
<p>PART 1 - The Importance of Security<br />
CHAPTER 1 Why Is Secure Programming a Concern?<br />
PART 2 - Maintaining a Secure Environment<br />
CHAPTER 2 Dealing with Shared Hosts<br />
CHAPTER 3 Maintaining Separate Development and Production Environments<br />
CHAPTER 4 Keeping Software Up to Date<br />
CHAPTER 5 Using Encryption I: Theory<br />
CHAPTER 6 Using Encryption II: Practice<br />
CHAPTER 7 Securing Network Connections I: SSL<br />
CHAPTER 8 Securing Network Connections II: SSH<br />
CHAPTER 9 Controlling Access I: Authentication<br />
CHAPTER 10 Controlling Access II: Permissions and Restrictions<br />
PART 3 - Practicing Secure PHP Programming<br />
CHAPTER 11 Validating User Input<br />
CHAPTER 12 Preventing SQL Injection<br />
CHAPTER 13 Preventing Cross-Site Scripting<br />
CHAPTER 14 Preventing Remote Execution<br />
CHAPTER 15 Enforcing Security for Temporary Files<br />
CHAPTER 16 Preventing Session Hijacking<br />
PART 4 - Practicing Secure Operations<br />
CHAPTER 17 Allowing Only Human Users<br />
CHAPTER 18 Verifying Your Users’ Identities<br />
CHAPTER 19 Using Roles to Authorize Actions<br />
CHAPTER 20 Adding Accountability to Track Your Users<br />
CHAPTER 21 Preventing Data Loss<br />
CHAPTER 22 Safely Executing System Commands<br />
CHAPTER 23 Handling Remote Procedure Calls Safely<br />
CHAPTER 24 Taking Advantage of Peer Review</p>
<p>Общо взето си има за всичко по-малко, обяснено с различни примери.</p>
<p><a rel="lightbox[php-security-books]" href="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/guide-to-php-security.jpg" title="Guide To PHP Security"><img src="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/guide-to-php-security-th.jpg" alt="Guide To PHP Security" style="position: relative; float: right; margin-left: 15px;" /></a></p>
<p>Една друга, заслущаваща внимание книга е <strong>Guide to PHP Security - A Step-by-step Guide to Writing Secure and Reliable PHP Applications, Ilia Alshanetsky, 2005</strong></p>
<p>ISBN 0-9738621-0-6<br />
И тази книга не е от вчера, което обаче не пречи написаното да е все още актуално. Покрива PHP5, както и предишната. И без това - както предполагам знаете - от 8 август е спряна поддръжката за PHP4, а и на хоризонта вече се задава PHP6. От съдържанието:</p>
<p>1 Input Validation<br />
2 Cross-Site Scripting Prevention<br />
3 SQL Injection<br />
4 Preventing Code Injection<br />
5 Command Injection<br />
6 Session Security<br />
7 Securing File Access<br />
8 Security through Obscurity<br />
9 Sandboxes and Tar Pits<br />
10 Securing Your Applications</p>
<p><a rel="lightbox[php-security-books]" href="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/hacker-web-exploitation.jpg" title="Hacker Web Exploitation"><img src="http://www.vlkomarov.info/blog/wp-content/uploads/2008/08/hacker-web-exploitation-th.jpg" alt="Hacker Web Exploitation" style="position: relative; float: right; margin-left: 15px;" /></a></p>
<p>И още една благинка, която съм засякал: <strong>Hacker Web Exploitation Uncovered, Marsel Nizamutdinov, 2005</strong></p>
<p>400 pages, ISBN:1931769494<br />
Тази още не съм я прегледал, но като гледам съдържанието мисля, че и тя покрива основни теми като XSS, SQL Injection, Remote File Inclusion, etc.</p>
<p>И още нещо за десерт. Ако имате в приложението си формуляр за upload на файлове, прочетете този документ (.pdf, 20 стр.). Сигурен съм, че ще ви е полезен, както беше и за мен <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> (<a href="http://www.net-security.org/dl/articles/php-file-upload.pdf" target="_blank">Secure File Upload In PHP Web Applications</a>)</p>
<p>Ами приятно четене и повечко спокойни нощи (след n на брой не толкова преди това).. Честно казано, колкото повече чета, толкова повече си мисля дали не е добре да се върнем 15 години назад към абсолютно статичен web модел <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vlkomarov.info/blog/2008/08/17/php-security-books-review/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mr GET Clean</title>
		<link>http://www.vlkomarov.info/blog/2008/08/17/mr-get-clean/</link>
		<comments>http://www.vlkomarov.info/blog/2008/08/17/mr-get-clean/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 15:07:05 +0000</pubDate>
		<dc:creator>Hamaelleon</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web development]]></category>

		<category><![CDATA[GET]]></category>

		<category><![CDATA[SQL Injection]]></category>

		<category><![CDATA[XSS]]></category>

		<category><![CDATA[заявка]]></category>

		<category><![CDATA[проверка]]></category>

		<category><![CDATA[сигурност]]></category>

		<guid isPermaLink="false">http://www.vlkomarov.info/blog/?p=86</guid>
		<description><![CDATA[Златни правила на уеб разработчика (web developers golden rulez):
1. Няма абсолютна и универсална защита, всичко подлежи на хакване!
2. Най-добре си го хаквай {скрипта} често, често сам и се.. оправяй.. сам, преди да те оправят други!
3. Грам никакво доверие на потребителя, т.е на каквото и да е идващо от GET, POST, COOKIE, SESSION, REQUEST (ако някой [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #ff9900;">Златни правила на уеб разработчика (web developers golden rulez):</span></strong></p>
<p><strong>1</strong>. Няма абсолютна и универсална защита, всичко подлежи на хакване!<br />
<strong>2</strong>. Най-добре си го хаквай {скрипта} често, често сам и се.. оправяй.. сам, преди да те оправят други!<br />
<strong>3</strong>. Грам никакво доверие на потребителя, т.е на каквото и да е идващо от GET, POST, COOKIE, SESSION, REQUEST (ако някой все още го ползва), HTTP Headers, etc.<br />
<strong>4</strong>. 13 проверки са по-добре от една или николко, но все пак не се знае дали са достатъчни..<br />
<strong>5</strong>. Ученето трябва да продължи!</p>
<p><span id="more-86"></span></p>
<p>Във връзка с една тема от миналата седмица в BGDev, ето един метод за почистване на GET заявки от излишни боклуци. </p>
<p>В заявката са допустими само параметри, дефинирани в масива $allowableParams и са забранени символите, посочени в другия conf масив: $forbiddenSymbols.</p>
<p>Разбира се, подобна реализация има своите ограничения (modRewrite, кирилица, search формуляри, събмитващи през GET и т.н.), така че в зависимост от приложението може да се променя съдържанието на масивите и изобщо цялата реализация на метода. Също така, при установяване на непозволени параметри или забранени символи (опити за XSS или SQL injection), освен логването на опита и редиректването към страница с &#8220;чиста&#8221; GET заявка, може да се добави и друга някаква функционалност: мейл до администратор, бан на потребител и т.н. </p>
<p>Така, ето как изглежда началото на една страница, която ще използва този клас:</p>
<pre class="syntax-highlight:php">
&lt; ?php
define(&#039;CLASSES_PATH&#039;, &quot;.&quot;);

$forbiddenSymbols	= array(&#039;&lt;&#039;, &#039;&gt;&#039;, &#039;(&#039;, &#039;)&#039;,
	&#039;..&#039;, &#039;%&#039;, &#039;*&#039;, &#039;+&#039;, &#039;!&#039;, &#039;@&#039;);
$allowableParams	= array(&#039;p&#039;, &#039;id&#039;);

if (isset($_SERVER[&#039;QUERY_STRING&#039;]) &amp;&amp;
	!еmрty($_SERVER[&#039;QUERY_STRING&#039;])) {

	require_once(CLASSES_PATH . &quot;/class.clean.php&quot;);
	$clean = new MrGETClean;

	$queryString = $clean-&gt;queryWalk($_SERVER[&#039;QUERY_STRING&#039;],
		$forbiddenSymbols,
		$allowableParams,
		$_SERVER[&#039;SCRIPT_NAME&#039;]);

	if ($queryString != $_SERVER[&#039;QUERY_STRING&#039;]) {
		$newURL = basename($_SERVER[&#039;SCRIPT_NAME&#039;]) .
			&#039;?&#039; . $queryString;
		header(&quot;location: &quot; . $newURL);
	}

}
</pre>
<p>Ето го и самия клас с основния метод <strong>queryWalk</strong>:</p>
<pre class="syntax-highlight:php">
&lt; ?php
define(&#039;LOG_PATH&#039;, &quot;log&quot;);

class MrGETClean {

function queryWalk($queryString,
	$forbiddenSymbols,
	$allowableParams,
	$scriptURL) {

	$flag = false;

	$queryFragments			= array();
	$queryArr				= array();
	$cleanedQueryFragments	= array();

	$queryFragments = explode(&quot;&amp;&quot;, $queryString);

	foreach ($queryFragments as $key =&gt; $value) {
		$queryArr[$key][&#039;p&#039;] =
			substr($value, 0, strpos($value, &#039;=&#039;));
		$queryArr[$key][&#039;v&#039;] =
			substr($value, strpos($value, &#039;=&#039;) + 1);
	}

	foreach ($queryArr as $key =&gt; $value) {
		if (!in_array($queryArr[$key][&#039;p&#039;],
				$allowableParams)) {
			$queryArr[$key] = null;
			$flag = true;
		}

		foreach ($forbiddenSymbols as $symbol) {
			if (stristr($queryArr[$key][&#039;v&#039;],
					$symbol)) {
				$queryArr[$key] = null;
				$flag = true;
			}
		}
	}		

	foreach ($queryArr as $key =&gt; $value) {
		if ($queryArr[$key][&#039;p&#039;] != null) {
			$cleanedQueryFragments[$key] =
				$queryArr[$key][&#039;p&#039;] . &quot;=&quot; .
				$queryArr[$key][&#039;v&#039;];
		}
	}

	if ($flag) {
		$this-&gt;MrGETCleanMakeLog($queryString,
			$scriptURL);
	}

	$queryString = implode(&quot;&amp;&quot;, $cleanedQueryFragments);

	return $queryString;

}
</pre>
<p>А това са методът, който генерира лог файла и този, който връща IP адреса на &#8220;атакуващия&#8221;:</p>
<pre class="syntax-highlight:php">
function MrGETCleanMakeLog($queryString, $scriptURL) {

	$date = date (&quot;d-m-Y @ H:i:s&quot;);
	$log = LOG_PATH . &quot;/log.txt&quot;;
	$handle = fopen($log,&quot;a+&quot; );
	fputs ($handle, &#039;Attack Date: &#039; . $date .
	&#039; | Attacker IP: &#039; . $this-&gt;getIP() .
	&#039; | Query: &#039; . htmlentities(urldecode($queryString)) .
	&#039; | Script: &#039; . $scriptURL . &quot;\r\n&quot;);
	fclose($handle);

}

function getIP() {

	$IP = &#039;&#039;;

	if (isset($_SERVER)) {
		if (isset($_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;])) {
			$IP = $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;];
		}
		elseif (isset($_SERVER[&#039;HTTP_CLIENT_IP&#039;])) {
			$IP = $_SERVER[&#039;HTTP_CLIENT_IP&#039;];
		}
		else {
			$IP = $_SERVER[&#039;REMOTE_ADDR&#039;];
		}
	}
	else {
		if (getenv(&#039;HTTP_X_FORWARDED_FOR&#039;))	{
			$IP = getenv(&#039;HTTP_X_FORWARDED_FOR&#039;);
		}
		elseif (getenv(&#039;HTTP_CLIENT_IP&#039;)) {
			$IP = getenv( &#039;HTTP_CLIENT_IP&#039; );
		}
		else {
			$IP = getenv(&#039;REMOTE_ADDR&#039;);
		}
	}

	return $IP;

}
</pre>
<p>Файловете, които са ви нужни са примерният <a href="http://www.vlkomarov.info/projects/mr-get-clean/index.php.txt" target="_blank">index.php</a> и класът <a href="http://www.vlkomarov.info/projects/mr-get-clean/class.clean.php.txt" target="_blank">class.clean.php</a>. Демото можете да пробвате тук: <a href="http://www.vlkomarov.info/projects/mr-get-clean/index.php?p=7&#038;id=13" target="_blank">www.vlkomarov.info/projects/mr-get-clean</a> (Log: <a href="http://www.vlkomarov.info/projects/mr-get-clean/log/log.txt" target="_blank">log.txt</a>). </p>
<p>Променяйте съобразно вашите нужди и спецификата на приложението. </p>
<p>Линкването на това демо не е задължително, но ще съм ви благодарен, ако го правите <img src='http://www.vlkomarov.info/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vlkomarov.info/blog/2008/08/17/mr-get-clean/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flash, XML, PHP, CMS - основата</title>
		<link>http://www.vlkomarov.info/blog/2008/07/12/flash-xml-php-cms_basic/</link>
		<comments>http://www.vlkomarov.info/blog/2008/07/12/flash-xml-php-cms_basic/#comments</comments>
		<pubDate>Sat, 12 Jul 2008 17:18:28 +0000</pubDate>
		<dc:creator>Hamaelleon</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web development]]></category>

		<category><![CDATA[XML]]></category>

		<category><![CDATA[back-end]]></category>

		<category><![CDATA[CMS]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Xground]]></category>

		<category><![CDATA[xgroundmodels]]></category>

		<category><![CDATA[администрация]]></category>

		<category><![CDATA[базисни положения]]></category>

		<category><![CDATA[Ексграунд]]></category>

		<category><![CDATA[основа]]></category>

		<guid isPermaLink="false">http://www.vlkomarov.info/blog/?p=83</guid>
		<description><![CDATA[
Абе просто съм се побъркал: вместо да ходя да.. разходя някоя подобна кака, аз седя отново зад компютъра (в събота) и работя. Мой ли проект? Ами не! Всъщност съм се закрастил яко с тази администрация на сайта на XGround Models.. ако беше &#8220;официално&#8221; поръчано щеше да ме домързи и да го работя вероятно в понеделник [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.vlkomarov.info/blog/wp-content/uploads/2008/07/lora-georgieva-xground.jpg" alt="Лора Георгиева - рекламно лица на XGround Models" /></p>
<p>Абе просто съм се побъркал: вместо да ходя да.. разходя някоя подобна кака, аз седя отново зад компютъра (в събота) и работя. Мой ли проект? Ами не! Всъщност съм се закрастил яко с тази администрация на сайта на XGround Models.. ако беше &#8220;официално&#8221; поръчано щеше да ме домързи и да го работя вероятно в понеделник към 4-5 сутринта.. ама не, като ми е интересно и си го човъркам по всяко време, без значение, че никой не го изисква..</p>
<p>Та, имаме <a href="http://www.xgroundmodels.com" target="_blank">Flash сайт</a>, който вече е изграден (т.е приемаме го за константа). Той използва семпли XML файлове като база данни. Задачата е да се напише back-end, чрез който да се редактират тези XML файлове, респективно да се променя обликът на front-end-a. <a href="http://www.vlkomarov.info/blog/2008/07/06/atom-solutions/" target="_blank">В предишната публикация</a> споменах за тази задача.</p>
<p><span id="more-83"></span></p>
<p>Оставяме настрана файловите операции (имам предвид качване, преоразмеряване, рязане на снимки, създаване на thumbnail-и, etc.) настрана, не се занимаваме и с DTD на този етап. Ползваме DOM за парсване и създаване на XML-ите и това е всичко. Основата..</p>
<p>Ако имаме XML файл със структура и съдържание подобно на следното:</p>
<pre class="syntax-highlight:xml">&lt; ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;models&gt;
&lt;model name=&quot;Флейта Тромпеткова&quot; age=&quot;23&quot;
readonly=&quot;1&quot;/&gt;
&lt;model name=&quot;Блонди Свиркова&quot; age=&quot;19&quot;
readonly=&quot;1&quot;/&gt;
&lt;model name=&quot;Ганка Заблейкова&quot; age=&quot;20&quot;
readonly=&quot;1&quot;/&gt;
&lt;model name=&quot;Учтивост Лицемеркова&quot; age=&quot;18&quot;
readonly=&quot;1&quot;/&gt;
&lt;model name=&quot;Съска Змейкова&quot; age=&quot;22&quot;
readonly=&quot;1&quot;/&gt;
&lt;/models&gt;
</pre>
<p>..то можем да извършваме базовите операции с помощта на методите от този примерен PHP клас. Тези операции са:<br />
- добавяне на нов елемент<br />
- редактиране на даден елемент<br />
- изтриване на елемент<br />
- пренареждане в произволен ред (не просто сортиране) на елементите</p>
<pre class="syntax-highlight:php">
&lt; ?php
class xmlLib {

// XML File Parse -&gt; PHP Array

function getXML($xmlFile) {
$xmlArr = array();
$c = 1;
$xml = new DomDocument(&#039;1.0&#039;, &#039;UTF-8&#039;);
$xml-&gt;load($xmlFile);
$root = $xml-&gt;documentElement;
$children = $root-&gt;childNodes;
foreach ($children as $element) {
if ($element-&gt;nodeType == XML_ELEMENT_NODE &amp;&amp;
$element-&gt;nodeName == &#039;model&#039;) {
$xmlArr[$c][&#039;name&#039;]	=
$element-&gt;getAttributeNode(&#039;name&#039;)-&gt;value;
$xmlArr[$c][&#039;age&#039;]	=
$element-&gt;getAttributeNode(&#039;age&#039;)-&gt;value;
$xmlArr[$c][&#039;readonly&#039;]	=
$element-&gt;getAttributeNode(&#039;readonly&#039;)-&gt;value;
$c++;
}
}
return $xmlArr;
}

// Add Entry

function addEntry($add, $xmlArr, $xmlFile) {
$p = sizeof($xmlArr) + 1;
$xmlArr[$p][&#039;name&#039;] = $add[&#039;name&#039;];
$xmlArr[$p][&#039;age&#039;] = $add[&#039;age&#039;];
$xmlArr[$p][&#039;readonly&#039;] = $add[&#039;readonly&#039;];
if ($this-&gt;saveXML($xmlFile, $xmlArr)) {
return true;
}
}

// Edit Entry

function editEntry($edit, $xmlArr, $xmlFile) {
$who = $edit[&#039;who&#039;];
foreach ($xmlArr as $key =&gt; $person) {
if ($xmlArr[$key][&#039;name&#039;] == $who &amp;&amp;
$xmlArr[$key][&#039;readonly&#039;] != &#039;1&#039;) {
$xmlArr[$key][&#039;name&#039;] = $edit[&#039;name&#039;];
$xmlArr[$key][&#039;age&#039;] = $edit[&#039;age&#039;];
}
}
if ($this-&gt;saveXML($xmlFile, $xmlArr)) {
return true;
}
}

// Remove Entry

function removeEntry($remove, $xmlArr, $xmlFile) {
$who = $remove[&#039;name&#039;];
foreach ($xmlArr as $key =&gt; $person) {
if ($xmlArr[$key][&#039;name&#039;] == $who &amp;&amp;
$xmlArr[$key][&#039;readonly&#039;] != &#039;1&#039;) {
$xmlArr[$key] = null;
}
}
if ($this-&gt;saveXML($xmlFile, $xmlArr)) {
return true;
}
}

// Set Entries Order

function setOrder($order, $xmlArr, $xmlFile) {
$tmp = array();
for ($i = 1; $i &lt; = sizeof($xmlArr); $i++) {
for ($j = 1; $j &lt;= sizeof($xmlArr); $j++) {
if ($order[$i - 1] == $xmlArr[$j][&#039;name&#039;]) {
$tmp[$i][&#039;name&#039;] = $xmlArr[$j][&#039;name&#039;];
$tmp[$i][&#039;age&#039;] = $xmlArr[$j][&#039;age&#039;];
$tmp[$i][&#039;readonly&#039;] =
$xmlArr[$j][&#039;readonly&#039;];
}
}
}
if ($this-&gt;saveXML($xmlFile, $tmp)) {
return true;
}
}

// Save PHP Array -&gt; XML File

function saveXML($xmlFile, $xmlArr) {
$xml = new DomDocument(&#039;1.0&#039;, &#039;UTF-8&#039;);
$xml-&gt;formatOutput = true;
$root = $xml-&gt;createElement(&#039;models&#039;);
$root = $xml-&gt;appendChild($root);
foreach ($xmlArr as $key =&gt; $person) {
if ($xmlArr[$key][&#039;name&#039;] != null) {
$model = $xml-&gt;createElement(&#039;model&#039;);
$model = $root-&gt;appendChild($model);
$name = $xml-&gt;createAttribute(&#039;name&#039;);
$name = $model-&gt;setAttribute(&#039;name&#039;,
$xmlArr[$key][&#039;name&#039;]);
$name = $model-&gt;appendChild($name);
$age = $xml-&gt;createAttribute(&#039;age&#039;);
$age = $model-&gt;setAttribute(&#039;age&#039;,
$xmlArr[$key][&#039;age&#039;]);
$age = $model-&gt;appendChild($age);
$readonly = $xml-&gt;createAttribute(&#039;readonly&#039;);
$readonly = $model-&gt;setAttribute(&#039;readonly&#039;,
$xmlArr[$key][&#039;readonly&#039;]);
$readonly = $model-&gt;appendChild($readonly);
}
}
if ($xml-&gt;save($xmlFile)) {
return true;
}
}
}
?&gt;
</pre>
<p>Кодът е семпъл и няма нужда от допълнителни коментари, старал съм се да пиша максимално чисто. Некондензиран и с допълнителни инденти го има и в <a href="http://www.vlkomarov.info/projects/xgroundmodels/cms/demo/index.php" target="_blank">демо страницата.</a></p>
<p><a href="http://www.vlkomarov.info/projects/xgroundmodels/cms/demo/index.php" target="_blank">Пробвайте демото</a> и си кажете мнението. Мързи ме да пиша повече. Точка.</p>
<p>Тъй като такива (изтрито) красавици като Лора надали се сещат за съществуването на моя милост мисля да отида да си купя един-два кроасана с шоколад и да се натъпча подобаващо.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vlkomarov.info/blog/2008/07/12/flash-xml-php-cms_basic/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
