<?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>Mon, 16 Jan 2012 21:03:44 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
	<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-12136</link>
		<dc:creator>m1chu</dc:creator>
		<pubDate>Mon, 16 Jan 2012 21:03:44 +0000</pubDate>
		<guid isPermaLink="false">http://m1chu.eu/?p=53#comment-12136</guid>
		<description>Gdyby ktoś miał kiedyś problem z nieprawidłową wielkością pobieranego pliku, chociażby w moich, wyżej wymienionych przykładach, to radzę spróbować dodać na początku skryptu &lt;strong&gt;ob_start()&lt;/strong&gt;, a przed samym &lt;strong&gt;readfile()&lt;/strong&gt; linię &lt;strong&gt;ob_end_clean()&lt;/strong&gt;.</description>
		<content:encoded><![CDATA[<p>Gdyby ktoś miał kiedyś problem z nieprawidłową wielkością pobieranego pliku, chociażby w moich, wyżej wymienionych przykładach, to radzę spróbować dodać na początku skryptu <strong>ob_start()</strong>, a przed samym <strong>readfile()</strong> linię <strong>ob_end_clean()</strong>.</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-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:

[php]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;;
}[/php]


### 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>
<pre class="brush: php; title: ;">if(strpos($_REQUEST['img_name'], '/')===false &amp;amp;&amp;amp; strpos($_REQUEST['article_id'], '/')===false)
   {
                    header(&quot;Content-type: image/&quot; . end($extensions));
                    readfile(&quot;/usr/home/sq8bgq/rozenek_img/&quot; . $_REQUEST['article_id'] . &quot;/&quot; . $_REQUEST['img_name']);
   }
else
{
echo &quot;ty kradzieju&quot;;
}</pre>
<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; title: ;">$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 08: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:
[php]$file = &#039;zalaczniki/&#039;.basename($_GET[&#039;name&#039;]);[/php]
?</description>
		<content:encoded><![CDATA[<p>A czy nie wystarczy takie zabezpieczenia przed pobieraniem pliku z innego katalogu:</p>
<pre class="brush: php; title: ;">$file = 'zalaczniki/'.basename($_GET['name']);</pre>
<p>?</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; title: ;">$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 18: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:
[php]
[...]
	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
[/php]
Wystarczyło by przed na początku zrobić:
[php]
$file = strreplace(&quot;..&quot;, &quot;&quot;, $_GET[&#039;file&#039;]);
if(!file_exists(&#039;./podkatalog/kolejny&#039;. $file) {
 exit();
}
// reszta kodu
[/php]
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:</p>
<pre class="brush: php; title: ;">
[...]
	header('Content-Length: ' . filesize('./podkatalog/kolejny/' . $_GET['file']));
[...]
	readfile('./podkatalog/kolejny/' . $_GET['file']); // ściągnięcie pliku
</pre>
<p>Wystarczyło by przed na początku zrobić:</p>
<pre class="brush: php; title: ;">
$file = strreplace(&quot;..&quot;, &quot;&quot;, $_GET['file']);
if(!file_exists('./podkatalog/kolejny'. $file) {
 exit();
}
// reszta kodu
</pre>
<p>Popraw mnie proszę, jeśli się mylę&#8230;</p>
]]></content:encoded>
	</item>
</channel>
</rss>

