cvs: phpdoc-cs / language-snippets.ent /security filesystem.xml

From: Date: Sat, 08 Jul 2006 20:23:21 +0000
Subject: cvs: phpdoc-cs / language-snippets.ent /security filesystem.xml
Groups: php.doc.cs 
Request: Send a blank email to doc-cs+get-189@lists.php.net to get a copy of this message
luk Sat Jul 8 20:23:21 2006 UTC Added files: /phpdoc-cs/security filesystem.xml Modified files: /phpdoc-cs language-snippets.ent Log: EN -> CS sync new translation http://cvs.php.net/viewvc.cgi/phpdoc-cs/language-snippets.ent?r1=1.32&r2=1.33&diff_format=u Index: phpdoc-cs/language-snippets.ent diff -u phpdoc-cs/language-snippets.ent:1.32 phpdoc-cs/language-snippets.ent:1.33 --- phpdoc-cs/language-snippets.ent:1.32 Sun Jun 11 19:06:02 2006 +++ phpdoc-cs/language-snippets.ent Sat Jul 8 20:23:21 2006 @@ -73,6 +73,14 @@ </varname>, <varname>$_POST</varname> a <varname>$_SERVER</varname>. Pro více informací viz èást manuálu o &link.superglobals;</para></note>'> +<!ENTITY note.timezone-errors '<note><para> +Od PHP 5.1.0 (kde byly pøepsány funkce pro datum a èas) je pøi ka¾dém zavolání +funkce pro datum/èas, pokud je èasová zóna neplatná, vygenerována zpráva +<constant>E_NOTICE</constant>; pokud se pou¾ívá systémové nastavení nebo +promìnná prostøedí <varname>TZ</varname>, generuje se zpráva +<constant>E_STRICT</constant>Viz také <function>date_default_timezone_set</function>. +</para></note>'> + <!ENTITY note.uses-ob '<note><para>Tato funkce vnitønì pou¾ívá výstupní bufferování s tímto parametrem a proto ji nelze pou¾ít uvnitø callbacku <function>ob_start</function>.</para></note>'> http://cvs.php.net/viewvc.cgi/phpdoc-cs/security/filesystem.xml?view=markup&rev=1.1 Index: phpdoc-cs/security/filesystem.xml +++ phpdoc-cs/security/filesystem.xml <?xml version="1.0" encoding="iso-8859-2"?> <!-- EN-Revision: 1.3 Maintainer: luk Status: ready --> <chapter id="security.filesystem"> <title>Bezpeènost souborových systémù</title> <simpara> PHP pracuje se zabezpeèením zabudovaným do vìt¹iny serverových systémù, které je zalo¾eno na oprávnìních k souborùm a adresáøùm. To vám umo¾òuje ovládat, které soubory v souborovém systému se smí èíst. Pozornost je potøeba vìnovat jakýmkoli souborùm, které jsou èitelné v¹em u¾ivatelùm, kvùli tomu, zda je skuteènì bezpeèné, aby je smìli èíst v¹ichni u¾ivatelé, kteøí mají k tomuto systému pøístup. </simpara> <simpara> Jeliko¾ je PHP navr¾eno tak, aby umo¾òovalo pøístup k filesystému na úrovni u¾ivatele, je vcelku mo¾né napsat PHP skript, který vám umo¾ní èíst systémové soubory, jako napø. /etc/passwd, mìnit konfiguraci ethernetu, posílat na tiskárnu obrovské tiskové úlohy apod. To má jasné dùsledky v tom, ¾e se musíte v¾dy ujistit, ¾e soubory, které chcete èíst nebo zapisovat, jsou skuteènì ty správné. </simpara> <simpara> Uva¾ujme následující skript, kde u¾ivatel øíká, ¾e by chtìl smazat soubor ve svém domovském adresáøi. To pøedpokládá situaci, kde se pro normální správu souborù pou¾ívá webové rozhraní implementované pomocí PHP, a u¾ivatel, pod ním¾ bì¾í Apache, má právo mazat soubory v domovských adresáøích u¾ivatelù. </simpara> <para> <example> <title>Slabá kontrola promìnných vede k....</title> <programlisting role="php"> <![CDATA[ <?php // odstraò soubor z domovského adresáøe u¾ivatele $username = $_POST['user_submitted_name']; $homedir = "/home/$username"; $file_to_delete = "$userfile"; unlink ("$homedir/$userfile"); echo "$file_to_delete byl smazán!"; ?> ]]> </programlisting> </example> Jeliko¾ se u¾ivatelské jméno posílá z formuláøe, mù¾e kdokoli poslat u¾ivatelské jméno a soubor patøící nìkomu jinému a mazat cizí soubory. V takovém pøípadì byste mìli chtít pou¾ívat nìjakou formu autentizace. Uva¾te, co by se mohlo stát, kdyby poslané promìnné obsahovaly "../etc/" a "passwd". Kód by pak mohl bez problémù èíst: <example> <title>...útoku na souborový systém</title> <programlisting role="php"> <![CDATA[ <?php // Odstraní soubor odkudkoli na pevném disku, kam má u¾ivatel PHP pøístup. // Má-li PHP rootovská práva: $username = "../etc/"; $homedir = "/home/../etc/"; $file_to_delete = "passwd"; unlink ("/home/../etc/passwd"); echo "/home/../etc/passwd byl smazán!"; ?> ]]> </programlisting> </example> Existují dvì dùle¾ité roviny, ve kterých byste se mìli tìmto problémùm bránit. <itemizedlist> <listitem> <simpara> Povolit programu PHP pouze omezená oprávnìní. </simpara> </listitem> <listitem> <simpara> Kontrolovat v¹echny zasílané promìnné. </simpara> </listitem> </itemizedlist> Zde je vylep¹ený skript: <example> <title>Bezpeènìj¹í kontrola názvu souboru</title> <programlisting role="php"> <![CDATA[ <?php // Odstraní soubor z pevného disku, kam má u¾ivatel PHP pøístup. $username = $_SERVER['REMOTE_USER']; // pou¾ití autentizaèního mechanismu $homedir = "/home/$username"; $file_to_delete = basename("$userfile"); // odøízni cestu unlink ($homedir/$file_to_delete); $fp = fopen("/home/logging/filedelete.log","+a"); // zaznamenej smazání $logstring = "$username $homedir $file_to_delete"; fwrite ($fp, $logstring); fclose($fp); echo "$file_to_delete byl smazán!"; ?> ]]> </programlisting> </example> Ov¹em ani toto není zcela neprùstøelné. Pokud by vá¹ autentizaèní systém povoloval u¾ivatelùm vytváøet si vlastní u¾ivatelská jména, a u¾ivatel by si vybral "../etc/", systém by byl opìt ohro¾en. Z tohoto dùvodu byste mìli preferovat lépe pøizpùsobenou kontrolu: <example> <title>Bezpeènìj¹í kontrola názvu souboru</title> <programlisting role="php"> <![CDATA[ <?php $username = $_SERVER['REMOTE_USER']; // pou¾ití autentizaèního mechanismu $homedir = "/home/$username"; if (!ereg('^[^./][^/]*$', $userfile)) die('bad filename'); // skonèi, nezpracovávej if (!ereg('^[^./][^/]*$', $username)) die('bad username'); // skonèi, nezpracovávej // atd... ?> ]]> </programlisting> </example> </para> <para> V závislosti na operaèním systému existuje celá ¹iroká ¹kála souborù, o které bychom se mìli zajímat, vèetnì souborù zaøízení (/dev/ nebo COM1), konfiguraèních souborù (soubory /etc/ a .ini), známé oblasti ukládání souborù (/home/, Dokumenty) atd. Proto je obvykle lep¹í ustanovit politiku, kde je zakázáno v¹echno kromì toho, co explicitnì povolíte. </para> </chapter> <!-- Keep this comment at the end of the file Local variables: mode: sgml sgml-omittag:t sgml-shorttag:t sgml-minimize-attributes:nil sgml-always-quote-attributes:t sgml-indent-step:1 sgml-indent-data:t indent-tabs-mode:nil sgml-parent-document:nil sgml-default-dtd-file:"../../manual.ced" sgml-exposed-tags:nil sgml-local-catalogs:nil sgml-local-ecat-files:nil End: vim600: syn=xml fen fdm=syntax fdl=2 si vim: et tw=78 syn=sgml vi: ts=1 sw=1 -->

« previous php.doc.cs (#189) next »