cvs: phpdoc-cs / language-snippets.ent /security filesystem.xml
[email protected] ("Lukas Jelinek") Sat, 08 Jul 2006 20:23:21 -0000
| Newsgroups | php.doc.cs |
|---|---|
| Message-ID | <cvsluk1152390201@cvsserver> |
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
-->