<?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; 2008 &#187; август</title>
	<atom:link href="http://www.vlkomarov.info/blog/2008/08/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>
	</channel>
</rss>
