<?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; проверка</title>
	<atom:link href="http://www.vlkomarov.info/blog/tag/%d0%bf%d1%80%d0%be%d0%b2%d0%b5%d1%80%d0%ba%d0%b0/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vlkomarov.info/blog</link>
	<description>Почти сериозен блог на една гола цица</description>
	<pubDate>Sun, 31 May 2009 20:01:50 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<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>
