<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Komentarze do: Jak zabezpieczyć skrypt PHP/MySQL? Część 1: luka Arbitrary File Download (AFD)</title>
	<atom:link href="http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/feed/" rel="self" type="application/rss+xml" />
	<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/</link>
	<description>we live, as we dream... alone - another devblog</description>
	<lastBuildDate>Sun, 29 Aug 2010 20:35:51 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
	<item>
		<title>Autor: Pawel</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5199</link>
		<dc:creator>Pawel</dc:creator>
		<pubDate>Fri, 09 Jul 2010 15:15:05 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5199</guid>
		<description>Witam

Na stronie http://www.rozenek.com/polski,198 opisalem podobny problem:


if(strpos($_REQUEST[&#039;img_name&#039;], &#039;/&#039;)===false &amp;&amp; strpos($_REQUEST[&#039;article_id&#039;], &#039;/&#039;)===false)
   {
                    header(&quot;Content-type: image/&quot; . end($extensions));
                    readfile(&quot;/usr/home/sq8bgq/rozenek_img/&quot; . $_REQUEST[&#039;article_id&#039;] . &quot;/&quot; . $_REQUEST[&#039;img_name&#039;]);
   }
else
{
echo &quot;ty kradzieju&quot;;
}


### if(strpos($_REQUEST[&#039;img_name&#039;], &#039;/&#039;)===false &amp;&amp; strpos($_REQUEST[&#039;article_id&#039;], &#039;/&#039;)===false)
### chroni przed atakiem typu: http://www.rozenek.com/,../../../../../../etc/passwd</description>
		<content:encoded><![CDATA[<p>Witam</p>
<p>Na stronie <a target="_blank" href="http://www.rozenek.com/polski,198"  rel="nofollow">http://www.rozenek.com/polski,198</a> opisalem podobny problem:</p>
<p>if(strpos($_REQUEST['img_name'], &#8216;/&#8217;)===false &amp;&amp; strpos($_REQUEST['article_id'], &#8216;/&#8217;)===false)<br />
   {<br />
                    header(&#8222;Content-type: image/&#8221; . end($extensions));<br />
                    readfile(&#8222;/usr/home/sq8bgq/rozenek_img/&#8221; . $_REQUEST['article_id'] . &#8222;/&#8221; . $_REQUEST['img_name']);<br />
   }<br />
else<br />
{<br />
echo &#8222;ty kradzieju&#8221;;<br />
}</p>
<p>### if(strpos($_REQUEST['img_name'], &#8216;/&#8217;)===false &amp;&amp; strpos($_REQUEST['article_id'], &#8216;/&#8217;)===false)<br />
### chroni przed atakiem typu: <a target="_blank" href="http://www.rozenek.com/,../../../../../../etc/passwd"  rel="nofollow">http://www.rozenek.com/,../../../../../../etc/passwd</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: m1chu</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5167</link>
		<dc:creator>m1chu</dc:creator>
		<pubDate>Thu, 07 Jan 2010 15:18:44 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5167</guid>
		<description>&lt;strong&gt;@Grzegorz&lt;/strong&gt;:
Tak. Chociażby dla projektów o szerokim i zarobkowym przeznaczeniu powinno się indywidualnie wprowadzać system zabezpieczeń. To co podaje ja, to tak jak napisałeś, ogólne sposoby, przykłady. Zawsze powtarzam, że nie chodzi o to, aby je kopiować, tylko żeby dzięki nim zrozumieć istotę problemu i bawić się samemu. Co do artykułu...tworzy się :] Właśnie dziś. Niestety notoryczny brak czasu powoduje, że nie mogę zasiąść do tego raz, a porządnie (chociażby na kilka dni), a muszę robić &quot;od czasu, do czasu&quot;.

&lt;strong&gt;@Pawel&lt;/strong&gt;:
Generalizując można by stwierdzić, że tak - wystarczy. W praktyce, &lt;strong&gt;może być&lt;/strong&gt; jednak niedostateczną obroną. Dlaczego? W pewnych przypadkach funkcja ta zwraca niepoprawny wynik. Przykład:
[php]$url = &#039;http://localhost/file.php?arg=x/x&amp;subarg=z&#039;;
print basename($url);
// zwróci: x&amp;subarg=z[/php]
Można więc wprowadzany parametr spreparować, o ile nie wykona się odpowiedniej filtracji, poprzez usunięcie ciągu po rozszerzeniu pliku.

Inną sprawą jest to, że nawet w najmniejszym stopniu nie kontrolujemy tego, jakie pliki można pobierać z danego katalogu. Dopóki ktoś, kto ma dostęp do niego (nieważne nawet, czy autoryzowany, czy nie) nie wrzuci do niego niepożądanych treści, powinno być ok. Co jednak w przeciwnym przypadku?</description>
		<content:encoded><![CDATA[<p><strong>@Grzegorz</strong>:<br />
Tak. Chociażby dla projektów o szerokim i zarobkowym przeznaczeniu powinno się indywidualnie wprowadzać system zabezpieczeń. To co podaje ja, to tak jak napisałeś, ogólne sposoby, przykłady. Zawsze powtarzam, że nie chodzi o to, aby je kopiować, tylko żeby dzięki nim zrozumieć istotę problemu i bawić się samemu. Co do artykułu&#8230;tworzy się :] Właśnie dziś. Niestety notoryczny brak czasu powoduje, że nie mogę zasiąść do tego raz, a porządnie (chociażby na kilka dni), a muszę robić &#8222;od czasu, do czasu&#8221;.</p>
<p><strong>@Pawel</strong>:<br />
Generalizując można by stwierdzić, że tak &#8211; wystarczy. W praktyce, <strong>może być</strong> jednak niedostateczną obroną. Dlaczego? W pewnych przypadkach funkcja ta zwraca niepoprawny wynik. Przykład:</p>
<pre class="brush: php;">$url = 'http://localhost/file.php?arg=x/x&#038;subarg=z';
print basename($url);
// zwróci: x&#038;subarg=z</pre>
<p>Można więc wprowadzany parametr spreparować, o ile nie wykona się odpowiedniej filtracji, poprzez usunięcie ciągu po rozszerzeniu pliku.</p>
<p>Inną sprawą jest to, że nawet w najmniejszym stopniu nie kontrolujemy tego, jakie pliki można pobierać z danego katalogu. Dopóki ktoś, kto ma dostęp do niego (nieważne nawet, czy autoryzowany, czy nie) nie wrzuci do niego niepożądanych treści, powinno być ok. Co jednak w przeciwnym przypadku?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Pawel</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5166</link>
		<dc:creator>Pawel</dc:creator>
		<pubDate>Thu, 07 Jan 2010 07:46:10 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5166</guid>
		<description>A czy nie wystarczy takie zabezpieczenia przed pobieraniem pliku z innego katalogu:
&lt;code&gt;	$file = &#039;zalaczniki/&#039;.basename($_GET[&#039;name&#039;]);&lt;/code&gt;
?</description>
		<content:encoded><![CDATA[<p>A czy nie wystarczy takie zabezpieczenia przed pobieraniem pliku z innego katalogu:<br />
<code>	$file = 'zalaczniki/'.basename($_GET['name']);</code><br />
?</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Grzegorz</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5159</link>
		<dc:creator>Grzegorz</dc:creator>
		<pubDate>Mon, 07 Dec 2009 09:11:25 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5159</guid>
		<description>W sumie racja - nie pomyślałem o takim przypadku. Pewnie dlatego, że jeszcze nigdy nie spotkałem się z takim layoutem plików, że w katalogu ./A są pliki do pobrania, a w ./A/B konfiguracja połączenia z bazą.
Myślę, że takie zabezpieczenia należy robić &quot;szyte na miarę&quot; zabezpieczanego systemu. Ale fajnie, że podałeś sposób ogólny. Czekam na kolejne z serii zabezpieczania skryptów PHP :)</description>
		<content:encoded><![CDATA[<p>W sumie racja &#8211; nie pomyślałem o takim przypadku. Pewnie dlatego, że jeszcze nigdy nie spotkałem się z takim layoutem plików, że w katalogu ./A są pliki do pobrania, a w ./A/B konfiguracja połączenia z bazą.<br />
Myślę, że takie zabezpieczenia należy robić &#8222;szyte na miarę&#8221; zabezpieczanego systemu. Ale fajnie, że podałeś sposób ogólny. Czekam na kolejne z serii zabezpieczania skryptów PHP :)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: m1chu</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5157</link>
		<dc:creator>m1chu</dc:creator>
		<pubDate>Mon, 07 Dec 2009 00:22:24 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5157</guid>
		<description>Ok, jest to jakieś zabezpieczenie &lt;strong&gt;@Grzegorz&lt;/strong&gt;. Chroni jednak przed poruszaniem się po katalogach nadrzędnych w stosunku do wywoływanego skryptu. Co jednak, jeżeli plik znajdować się będzie w jakimś podkatalogu?
[php]$file = strreplace(&quot;..&quot;, &quot;&quot;, &quot;/zaglebiony/plik.exe&quot;);
if(!file_exists(&#039;./podkatalog/kolejny&#039;. $file) {
exit();
}
// reszta kodu[/php]
Co, jeżeli znajdować się w nim będą powiedzmy i pliki wykonywalne, i PHP? Warto ograniczyć wtedy możliwość pobierania wzorcem lub poprzez określenie dozwolonych rozszerzeń. Ostatecznie, aby pozbyć się zagrożenia w postaci przekazywania parametru w postaci encji lub postaci &lt;strong&gt;#%%&lt;/strong&gt; warto filtrować wejściowe dane. Wszystko to jest opisane w artykule (część przykładów). Te dodatki mogą się wydać drobnostkami, ale lepiej dmuchać na zimne.</description>
		<content:encoded><![CDATA[<p>Ok, jest to jakieś zabezpieczenie <strong>@Grzegorz</strong>. Chroni jednak przed poruszaniem się po katalogach nadrzędnych w stosunku do wywoływanego skryptu. Co jednak, jeżeli plik znajdować się będzie w jakimś podkatalogu?</p>
<pre class="brush: php;">$file = strreplace("..", "", "/zaglebiony/plik.exe");
if(!file_exists('./podkatalog/kolejny'. $file) {
exit();
}
// reszta kodu</pre>
<p>Co, jeżeli znajdować się w nim będą powiedzmy i pliki wykonywalne, i PHP? Warto ograniczyć wtedy możliwość pobierania wzorcem lub poprzez określenie dozwolonych rozszerzeń. Ostatecznie, aby pozbyć się zagrożenia w postaci przekazywania parametru w postaci encji lub postaci <strong>#%%</strong> warto filtrować wejściowe dane. Wszystko to jest opisane w artykule (część przykładów). Te dodatki mogą się wydać drobnostkami, ale lepiej dmuchać na zimne.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Grzegorz</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5156</link>
		<dc:creator>Grzegorz</dc:creator>
		<pubDate>Thu, 03 Dec 2009 17:04:30 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5156</guid>
		<description>Szczerze mówiąc to nie bardzo wiem po co zaproponowałeś takie sposoby zabezpieczeń?
W podanym przez Ciebie podatnym przykładzie:
&lt;code&gt;
[...]
	header(&#039;Content-Length: &#039; . filesize(&#039;./podkatalog/kolejny/&#039; . $_GET[&#039;file&#039;]));
[...]
	readfile(&#039;./podkatalog/kolejny/&#039; . $_GET[&#039;file&#039;]); // ściągnięcie pliku
&lt;/code&gt;
Wystarczyło by przed na początku zrobić:
&lt;code&gt;
$file = strreplace(&quot;..&quot;, &quot;&quot;, $_GET[&#039;file&#039;]);
if(!file_exists(&#039;./podkatalog/kolejny&#039;. $file) {
 exit();
}
// reszta kodu
&lt;/code&gt;
Popraw mnie proszę, jeśli się mylę...</description>
		<content:encoded><![CDATA[<p>Szczerze mówiąc to nie bardzo wiem po co zaproponowałeś takie sposoby zabezpieczeń?<br />
W podanym przez Ciebie podatnym przykładzie:<br />
<code><br />
[...]<br />
	header('Content-Length: ' . filesize('./podkatalog/kolejny/' . $_GET['file']));<br />
[...]<br />
	readfile('./podkatalog/kolejny/' . $_GET['file']); // ściągnięcie pliku<br />
</code><br />
Wystarczyło by przed na początku zrobić:<br />
<code><br />
$file = strreplace("..", "", $_GET['file']);<br />
if(!file_exists('./podkatalog/kolejny'. $file) {<br />
 exit();<br />
}<br />
// reszta kodu<br />
</code><br />
Popraw mnie proszę, jeśli się mylę&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: m1chu</title>
		<link>http://m1chu.eu/2008/09/11/jak-zabezpieczyc-skrypt-phpmysql-czesc-1-luka-arbitrary-file-download-afd/comment-page-1/#comment-5144</link>
		<dc:creator>m1chu</dc:creator>
		<pubDate>Tue, 01 Dec 2009 13:46:21 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-5144</guid>
		<description>Faktycznie. Twórc&lt;strong&gt;ą&lt;/strong&gt; możesz być Ty, ja, każda pojedyncza osoba, a nie grupa. Błąd oczywiście poprawiłem. Dzięki za jego wskazanie :]

Co do hiperpoprawności. Nie widzę przeciwwskazań jeżeli ktoś się takową dewizą kieruje, o ile nie robi tego z jakimś przesadnym chełpieniem. Sam na pewno taką osobą nie jestem, bo po prostu robię za dużo błędów (szczególnie w kwestii znaków interpunkcyjnych). Po prostu staram się pisać tak, żeby dało się to czytać bez włączania jakiegoś dodatkowego deszyfratora ;]</description>
		<content:encoded><![CDATA[<p>Faktycznie. Twórc<strong>ą</strong> możesz być Ty, ja, każda pojedyncza osoba, a nie grupa. Błąd oczywiście poprawiłem. Dzięki za jego wskazanie :]</p>
<p>Co do hiperpoprawności. Nie widzę przeciwwskazań jeżeli ktoś się takową dewizą kieruje, o ile nie robi tego z jakimś przesadnym chełpieniem. Sam na pewno taką osobą nie jestem, bo po prostu robię za dużo błędów (szczególnie w kwestii znaków interpunkcyjnych). Po prostu staram się pisać tak, żeby dało się to czytać bez włączania jakiegoś dodatkowego deszyfratora ;]</p>
]]></content:encoded>
	</item>
</channel>
</rss>
