cvs: phpdoc-ar /security index.xml
[email protected] ("Hafid Benhadria") Wed, 23 Jul 2003 21:48:19 -0000
| Newsgroups | php.doc.ar |
|---|---|
| Message-ID | <cvshafid1058996899@cvsserver> |
hafid Wed Jul 23 17:48:19 2003 EDT
Added files:
/phpdoc-ar/security index.xml
Log:
updated to En 1.58
hafid-20030723174819.txt
(text/plain, 75.8 KB)
Index: phpdoc-ar/security/index.xml
+++ phpdoc-ar/security/index.xml
<?xml version="1.0" encoding="ISO-8859-6"?>
<!-- $Revision: 1.1 $ -->
<!-- Updated to En 1.58 -->
<chapter id="security.index">
<title>ÇäÃåæ</title>
<simpara>
PHP çê äÚÉ âèêÉ èÇäåÊÑÌå¬ ÓèÇÁ Êå ÊÖåêæç
áê ÎÇÏå èêÈ Ùäé Ãæç èÍÏÉ Ãè Êå ÊæáêÐç Ùäé Ãæç ËæÇÆêÉ
<acronym>CGI</acronym> åæáÕäɬ áÅæç êãèæ âÇÏÑÇ Ùäé èäèÌ ÇäåäáÇʬ ÊæáêÐ
ÇäÃèÇåÑ èáÊÍ èÕäÇÊ ÇäÔÈãÇÊ Ùäé ÇäÎÇÏå. çÐç
ÇäÎÕÇÆÕ ÊÌÙä Ãê ÔêÁ êïÔîÚñîä Ùäé ÎÇÏå èêÈ åÇ ÚêÑ Âåæ èÐäã ÈÔãä ÇáÊÑÇÖê.
ÕïåðåîÊ PHP ÎÕêÕÇ äÊãèæ äÚÉ
ãÊÇÈÉ ÈÑÇåÌ CGI ÊÊÓå ÈÃæçÇ ÃãËÑ ÃåæÇ åæ Perl Ãè C èåæ ÎäÇä ÇäåÎÊÇÑÇÊ ÇäÕÇÆÈÉ
åæ ÎêÇÑÇÊ ÊçêÆÉ Òåæê ÇäÊÌåêÙ èÇäÊÔÚêä èãÐÇ ååÇÑÓÇÊ ÇäÊÔáêÑ ÇäåäÇÆåɬ
êåãæ ä PHP Ãæ ÊÙ×ê㬠èÈÔãä Ïâê⬠ÊÑãêÈÉ ÇäÍÑêÉ
èÇäÃåæ ÇäÊê ÊÍÊÇÌçÇ.
</simpara>
<simpara>
åËäåÇ ÊèÌÏ ×Ñâ åÎÊäáÉ äÇÓÊÙåÇä PHP¬ ÊèÌÏ ÃêÖÇ ÙÏÉ
ÎêÇÑÇÊ ÊçêÆÉ äåÑÇâÈÉ ÓäèãçÇ. åÎÊÇÑÇÊ
èÇÓÙÉ åæ ÇäÎêÇÑÇÊ ÊÖåæ äã ÅåãÇæêÉ ÇÓÊÙåÇä PHP äÃÚÑÇÖ
åÊÙÏÏɬ èêÙæê Ðäã ÃêÖÇ èÌèÏ ÊÑãêÈÇÊ åæ çÐç
ÇäÎêÇÑÇÊ èÊçêÆÇÊ ÇäÎÇÏå ÇäÊê ÊÄÏê Åäé æÊêÌÉ
ÊæÕêÈ ÚêÑ Âåæ.
</simpara>
<simpara>
ÊÌÏ åÑèæÉ ÊçêÆÉ PHP æÏÇ äçÇ êÊåËä áê åÑèæÉ ÇäÔêáÑÉ.
êåãæ ä PHP Ãæ ÊÓÊÙåä ÈÚÑÖ ÊÔêêÏ Ê×ÈêâÇÊ ÎÇÏåêÉ ãÇåäÉ
Èãä ÇäâÏÑÉ ÇäÊê êÕÈÍ åÓÊÎÏå ÇäÕîÏîáîÉ (shell) êÊèáÑ ÙäêçÇ ãåÇ êåãæ ä PHP Ãæ ÊÓÊÙåä
åæ ÃÌä ÊÖåêæÇÊ ÈÓê×É æÇÍêÉ-ÇäÎÇÏå èÈÃâä ÇäÊÈÙÇÊ áê ÈêÆÉ
åÊÍãå áêçÇ ÈÔãä èËêâ. ×ÑêâÉ ÊÔêêÏ çÐç ÇäÈêÆÉ èãÐÇ ÏÑÌÉ
ÃåÇæçÇ ÊâÙ åÓÄèäêÊçÇ ÃÓÇÓÇ Ùäé ÙÇÊâ å×èÑ PHP.
</simpara>
<simpara>
êÈÏà çÐÇ ÇäáÕä ÈÈÙÖ ÇäæÕÇÆÍ ÇäåÊÙäâÉ ÈÇäÃåæ ÇäÙÇå¬ êÔÑÍ
åÎÊäá ÇäÊÑãêÈÇÊ ÇäÎÇÕÉ ÈÎêÇÑÇÊ ÇäÊçêÆÉ èÇäèÖÙêÇÊ
ÇäÊê êåãæ ÇÓÊÙåÇäçÇ áêçÇ ÈÃåÇæ¬ èêÕá ÃêÖÇ åÎÊäá ÇäÅÙÊÈÇÑÇÊ áêåÇ êÎÕ
ÇäÊÔáêÑ ÈÍÓÈ ÇÎÊäÇá åÓÊèêÇÊ ÇäÃåæ.
</simpara>
<sect1 id="security.general">
<title>ÅÙÊÈÇÑÇÊ ÙÇåÉ</title>
<simpara>
Åæ èÌèÏ æØÇå Âåæ È×ÑêâÉ ãÇåäÉ çè ÇÓÊÍÇäÉ ÇáÊÑÇÖêɬ èáê çÐÇ ÇäÅ×ÇѬ
ÚÇäÈÇ åÇ ÊïÓÊÙåä áê åçæÉ ÇäÃåæ åâÇÑÈÉ ÊÊåËä áê ÅÍÏÇË ÊèÇÒæ Èêæ
ÇäåÌÇÒáÉ èâÇÈäêÉ ÇäÅÓÊÙåÇä. ÅÐÇ ÇâÊÖé ãä åÊÚêÑ ÙæÏ ÅÑÓÇäç åæ âÈä åÓÊÎÏå åÇ
Ôãäêæ åæ ÃÔãÇä ÇäÊÕÏêâ ÇäÅÍÕÇÆê ÇäÅÍêÇÆê (biometric validation) (åËä åÓÍ äÔÈãêÉ ÇäÙêæ retinal scan
èÈÕåÉ ÇäÅÕÈÙ fingerprint)¬ áêåãæ Ãæ ÊîÍòÕïäî Ùäé åÓÊèé åÑÊáÙ ääÚÇêÉ åæ
ÇÙÊåÇÏêÉ ÇäÃÏÇÁ ÇäåÍÇÓÈêñ. êÙæê çÐÇ ÃêÖÇ Ãæ ÇäÃåÑ ÓêâÊÖê ÈÑçÉ æÕá ÓÇÙÉ åæ ÃÌä åäÃ
æåèÐÌ åÊèÓ× ÇäÊÙâêϬ ååÇ êÔÌÙ ÇäåÓÊÎÏåêæ Ùäé ÅêÌÇÏ ×Ñâ
äÊÌÇèÒ ÇäÃåæ.
</simpara>
<simpara>
Åæ ÃáÖä ÃåÇæ çè áê ÇäÚÇäÈ ÚêÑ ÈÇÑÒ ÈåÇ áêç ÇäãáÇêÉ åæ ÃÌä åäÇÁåÉ
ÇäåÊ×äÈÇÊ åæ Ïèæ åæÙ ÇäåÓÊÎÏå åæ ÅÊåÇå
Ùåäç¬ Ãè ÇäÅËâÇä ÇäÒÇÆÏ äÔêáÑÉ ÇäåÄäá åæ ÎäÇä
ÇäÊÙâêÏ ÇäåáÑ×. èáÙäǬ áÅæ ÈÙÖ ÇäçÌèåÇÊ ÇäÃåæêÉ çê ÈÈÓÇ×É ÇÓÊÚäÇäÇÊ
äçÐÇ ÇäæèÙ åæ ÇäÃåæ ÇäåÙÒÒ Åäé ÍÏ åáÑ× èÇäÂÎÐ áê ÇäÊäÇÔê åÙ ÇäÒåæ.
</simpara>
<simpara>
ÙÈÇÑÉ ÊÓÊÍâ ÇäÊÐãêÑ: áâ× êãèæ æØÇå åÇ ÌêÏÇ ÈÍÓÈ ÃÖÙá
ÍäâÉ áê ÇäÓäÓäÉ. ÅÐÇ ãÇæ êÊå ÊÏèêæ ãä ÇäåÙÇåäÇÊ ÈÕèÑÉ èËêâÉ Ùäé ÃÓÇÓ
Çäèâʬ ÇäåãÇæ¬ æèÙ ÇäåÙÇåäɬ ÅäÎ. áê Íêæ êÊå ÇäÊÍââ åæ ÇäåÓÊÎÏå áâ×
åæ ÎäÇä åÌÑÏ åäá ÊÙÑêá ÇäÅÑÊÈÇ׬ áÅæ ÃÕÍêÉ ÑÈ× ÇäåÓÊÎÏåêæ
ÈÏêèÇæ ÇäåÙÇåäÇÊ ÊÖÙá ÈÔÏÉ.
</simpara>
<simpara>
ÙæÏ ÇäÅÎÊÈÇѬ ÊÐñãÑ Ãæã äæ Êãèæ âÇÏÑÇ Ùäé ÇÎÊÈÇÑ ãä
ÇäÅåãÇæêÇÊ ÍÊé Êäã ÇäÎÇÕÉ ÈÃÈÓ× ÇäÕáÍÇÊ. Åæ ÇäåïÏÎä ÇäÐê êåãæ
Ãæ ÊÊèâÙç Óêãèæ ÊåÇåÇ åæ Ïèæ ÃêÉ ÕäÉ ÈÇäåïÏÎä ÇäåïÙò×îé åæ âÈä
åèØá ÓÇÎ׬ âÑÕÇæ ÈÌÙÊç ÙÏÉ ÃÔçÑ åæ ÇäååÇÑÓÉ
Ãè ÍÊé â× åæÒäê êåÔê Ùäé äèÍÉ ÇäåáÇÊêÍ. äçÐÇ ãäç
êïáîÖä ÇäæØÑ áê ÇäÔêáÑÉ È忨èÑ åæ×âê äÊåêêÒ
åèÇâÙ ÇäÈêÇæÇÊ ÚêÑ ÇäåÊèâÙÉ èÇäÊê êïåãæ ÅÏÎÇäçÇ èÍêæçÇ ÊÊÈñïÙ ãêáêÉ
ÊÙÏêäçǬ ÅæâÇÕçÇ Ãè ÊãÈêÑçÇ.
</simpara>
<simpara>
Åæ ÇäÅæÊÑæÊ åäêÁ ÈÃæÇÓ êÍÇèäèæ ÇäÍÕèä Ùäé ÇäÔçÑÉ
äÃæáÓçå åæ ÎäÇä ÅÙÇâÉ ÔêáÑÊ㬠ÌÙä åèâÙã êæçÇѬ ÅÑÓÇä
åÍÊèé ÚêÑ äÇÆâ ååÇ êÌÙä êèåã Ùäé ÇäæâêÖ ÔêñðâëÇ.
äÇ êçå Åæ ãæÊ Êåäã åèâÙÇ ÕÚêÑÇ Ãè ãÈêÑǬ ÃæÊ
åïÓÊçÏá äåÌÑÏ Ãæã Ùäé ÇäÎ׬ èäåÌÑÏ Ãæã ÊåÊäã ÎÇÏåÇ
êåãæ ÇäÅÊÕÇä Èç. çæÇã ÙÏÉ ÈÑÇåÌ âÑÕæÉ äÇ Êãêä ÈåãêÇäêæ¬ çê
ÈÈÓÇ×É Êâèå ÈÙåäêÉ ÊåÔê× äåâÇ×Ù èÇÓÙÉ åæ åÑÇÓêå ÇäÅæÊÑæÊ (IP blocks) ÈÍËÇ Ùæ ÖÍÇêÇ. ÍÇèä Ãæ äÇ ÊÕÈÍ
ÅÍÏÇçÇ.
</simpara>
</sect1>
<sect1 id="security.cgi-bin">
<title>Installed as CGI binary</title>
<sect2 id="security.cgi-bin.attacks">
<title>çÌèåÇÊ ååãæÉ</title>
<simpara>
êÊÓå ÇÓÊÙåÇä PHP Ùäé Ôãä ËæÇÆêÉ <acronym>CGI</acronym> Èãèæç ÎêÇÑÇ
ääÊæÕêÈÇÊ ÇäÊê åæ ÃÌä ÓÈÈ åÙêæ äÇ ÊèÏ ÅÏåÇÌ PHP Ùäé Ôãä
èÍÏÉ Öåæ ÈÑæÇåÌ ÇäÎÇÏå (åËä Apache)¬ è ÇäÊê ÓÊÓÊÙåä PHP ÈÃæèÇÙ
åÎÊäáÉ åæ ÃÚäáÉ CGI ÈÚÑÖ Îäâ ÈêÆÇÊ chroot è setuid
ÂåæÉ åæ ÃÌä ÇäÓãÑêÈÊÇÊ. çÐÇ ÇäÊæÕêÈ êÓÊäÒå áê ÇäÙÇÏÉ ÊËÈêÊ
ËæÇÆêÉ PHP ÇäâÇÈäÉ ääÊæáêÐ áê åÌäÏ cgi-bin ÇäÎÇÕ ÈÎÇÏå ÇäèêÈ. ÊèÕê CERT
ääÅÓÊÔÇÑÇÊ <ulink url="&url.cert;">CA-96.11</ulink>
ÈÙÏå èÖÙ Ãê åïÄîèñðä Öåæ cgi-bin. ÍÊé èÅæ ãÇæ ÈÇäÅåãÇæ ÇÓÊÙåÇä ËæÇÆêÉ PHP
ãåïÄîèñðä åæáÑϬ áÅæ PHP âÏ Õïåñðå
åæ ÃÌä ÊÌæêÈ ÇäçÌèåÇÊ ÇäÊê êÌÙä åæçÇ çÐÇ ÇäæèÙ åæ ÇäÊæÕêÈ ååãæÉ:
</simpara>
<itemizedlist>
<listitem>
<simpara>
ÙæÏ èäèÌ åäáÇÊ Ç俨Çå: <filename role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>
</simpara>
<simpara>
ÇäåÙäèåÇÊ ÇäÅÓÊáçÇåêÉ áê åÍÏÏ åÇ ääåèÑÏ ÇäåÊÔÇÈç (URL) ÇäÊê ÊÊÈÙ ÙäÇåÉ ÇäÅÓÊáçÇå (?) êÊå
ÊåÑêÑçÇ åæ âÈä èÇÌçÉ CGI Åäé ÇäåïÄîèñðä Ùäé Ôãä åÄÔÑÇÊ äÓ×Ñ ÇäÃèÇåÑ.
áê ÇäÙÇÏɬ Êâèå ÇäåïÄñîèñðäÇÊ ÈáÊÍ èÊæáêÐ Çäåäá
ÇäåâÕèÏ Ùäé Ãæç ÇäåÄÔÑ ÇäÃèä Ùäé Ó×Ñ ÇäÃèÇåÑ.
</simpara>
<simpara>
ÙæÏ ÇÓÊÍÖÇÑç Ùäé Ôãä ËæÇÆêÉ CGI¬ êâèå PHP ÈÑáÖ ÊÃèêä
åÄÔÑÇÊ Ó×Ñ ÇäÃèÇåÑ.
</simpara>
</listitem>
<listitem>
<simpara>
ÙæÏ èäèÌ Ãê åÓÊæÏ èêÈ Ùäé ÇäÎÇÏå: <filename role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>
</simpara>
<simpara>
êÊÓå ÇäÌÒÁ ÇäåÙäèåÇÊê ÇäåÊÙäâ ÈÇäåÓÇÑ ÇäÎÇÕ ÈåÍÏÏ ÇäåèÑÏ ÇäåÊÔÇÈç (URL) ÇäÊê êÊÈÙ ÅÓå ËæÇÆêÉ PHP
<filename role="uri">/secret/doc.html</filename>
Èãèæç åÓÊÙåäÇ ÈÔãä åÃäèá ÈÚÑÖ ÊÍÏêÏ ÅÓå Çäåäá ÇäÐê êÌÈ
áÊÍç èÊÃèêäç åæ âÈä ÈÑæÇåÌ <acronym>CGI</acronym>.
áê ÇäÙÇÏɬ êÊå ÇÓÊÙåÇä ÈÙÖ ÊèÌêçÇÊ ÊçêÆÉ ÎÇÏå ÇäèêÈ (Apache:
Action) ÈÚÑÖ ÅÙÇÏÉ ÊÍèêä ×äÈêÇÊ ÇäåÓÊæÏÇÊ åËä
<filename role="url">http://my.host/secret/script.php</filename> Åäé
åïÄîèñðä PHP. åæ ÎäÇä çÐÇ ÇäÊæÕêȬ êâèå ÎÇÏå ÇäèêÈ ÃèäÇ ÈÊáâÏ
ÊÑÇÎêÕ ÇäèäèÌ Åäé ÇäåÌäÏ <filename role="uri">/secret</filename>¬ èÈÙÏ Ðäã êÎäâ
Çä×äÈêÉ ÇäåÙÇÏ ÊèÌêççÇ <filename role="url">http://my.host/cgi-bin/php/secret/script.php</filename>.
ääÃÓᬠÅÐÇ Êå ÊâÏêå Çä×äÈêÉ åæÐ ÇäÈÏÇêÉ Ùäé çÐÇ ÇäÔãä¬
áÅæ ÎÇÏå ÇäèêÈ äæ êâèå ÈÃê ÊáâÏ ääèäèÌ Åäé Çäåäá <filename role="uri">/secret/script.php</filename>¬ Èä ÓêãÊáê ÈÇäåäá
<filename role="uri">/cgi-bin/php</filename>. ÈçÐç Çä×Ñêâɬ
áÅæ Ãê åÓÊÎÏå êïâòÈîäï èäèÌç ä <filename role="uri">/cgi-bin/php</filename> êãèæ ÈÇÓÊ×ÇÙÊç èäèÌ Ãê
åÓÊæÏ åÍåê Ùäé ÎÇÏå ÇäèêÈ.
</simpara>
<simpara>
áê PHP¬ êåãæ ÇÓÊÙåÇä ÎêÇÑ ÊçêÆÉ Òåæ ÇäÊÌåêÙ <link linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
èãÐÇ ÊèÌêçÇÊ ÊçêÆÉ Òåæ ÇäÊÔÚêä <link linkend="ini.doc-root">doc_root</link> è <link linkend="ini.user-dir">user_dir</link> åæ ÃÌä ÊÌæêÈ
çÐÇ ÇäçÌèå¬ ÅÐÇ ãÇæÊ ÔÌÑÉ åÓÊæÏÇÊ ÇäÎÇÏå ÊÊèáÑ Ùäé Ãê åÌäÏÇÊ
ÐÇÊ ÊÖêêâÇÊ èäèÌ. Ãäâê æØÑÉ Åäé ÇäÃÓáä åæ ÃÌä ÇäÍÕèä Ùäé ÔÑÍ ãÇåä
äåÎÊäá ÇäÊÑãêÈÇÊ.
</simpara>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="security.cgi-bin.default">
<title>ÇäÍÇäÉ 1: áâ× ÇäåäáÇÊ ÇäÙÇåÉ ÊÊå ÎÏåÊçÇ</title>
<simpara>
ÅÐÇ ãÇæ ÎÇÏåã äÇ êÍÊèê åÖåèæÇ ÚêÑ åâêñÏ
ÈãäåÉ åÑèÑ Ãè åæ ÎäÇä åÑÇâÈÉ ÇäèäèÌ ÇäâÇÆåÉ Ùäé ÃÓÇÓ åÑÇÓêå ÇäÅæÊÑæÊ (IP)¬ áäÇ ÍÇÌÉ ÍêæÆÐ
äÎêÇÑÇÊ ÇäÊçêÆÉ çÐç. ÅÐÇ ãÇæ ÎÇÏå ÇäèêÈ äÏêã äÇ êÓåÍ
äã ÈÇäâêÇå ÈÙåäêÇÊ ÅÙÇÏÉ ÇäÊèÌêç¬ Ãè Ãæ ÇäÎÇÏå äÇ êÊèáÑ Ùäé ×ÑêâÉ
ääÅÊÕÇä ÈËæÇÆêÉ PHP ÍÊé Êãèæ Çä×äÈêÉ ÙÈÇÑÉ Ùæ
×äÈêÉ åÙÇÏ ÊèÌêççÇ ÈÔãä Â忬 áÈÅåãÇæã ÊÍÏêÏ çÐÇ ÇäÎêÇÑ <link linkend="install.configure.enable-force-cgi-redirect">--enable-force-cgi-redirect</link>
áê ÓãÑêÈÊ ÇäÊçêÆÉ. ÓÊØä ÈÍÇÌÉ ääÊÃãÏ åæ Ãæ ÓãÑêÈÊÇÊ PHP
ÇäÎÇÕÉ Èã äÇ ÊÙÊåÏ ÃêÇ åæ Çä×ÑêâÊêæ åæ ÃÌä åæÇÏÇÉ ÇäÓãÑêÈʬ
ÓèÇÁ åÈÇÔÑÉ åæ ÎäÇä <filename role="php">http://my.host/cgi-bin/php/dir/script.php</filename>
Ãè åæ ÎäÇä ÅÙÇÏÉ ÇäÊèÌêç <filename role="php">http://my.host/dir/script.php</filename>.
</simpara>
<simpara>
êåãæ ÊçêÆÉï ÅÙÇÏÉ ÇäÊèÌêç áê Apache åæ ÎäÇä ÇÓÊÙåÇä ÊèÌêçÇÊ AddHandler
è Action (ÃæØÑ áê ÇäÃÓáä).
</simpara>
</sect2>
<sect2 id="security.cgi-bin.force-redirect">
<title>ÇäÍÇäÉ 2: ÅÓÊÙåÇä --enable-force-cgi-redirect</title>
<simpara>
çÐÇ ÇäÎêÇÑ ÇäÎÇÕ ÈÒåæ ÇäÊÌåêÙ êÓÇÙÏ Ùäé ÊáÇÏê Ãæ êâèå Ãê ÔÎÕ ÈåæÇÏÇÉ PHP
åÈÇÔÑÉ ÈèÇÓ×É åÍÏÏ åèÑÏ åÊÔÇãä (URL) åËä <filename role="php">http://my.host/cgi-bin/php/secretdir/script.php</filename>.
ÈÏäÇ åæ Ðä㬠êâèå PHP ÈÇäÊáÓêÑ Ùäé çÐÇ Çäæå× áâ× ÅÐÇ ÓÇÑ Ùäé
âÇÙÏÉ ÅÙÇÏÉ ÇäÊèÌêç Åäé ÎÇÏå ÇäèêÈ.
</simpara>
<simpara>
áê ÇäÙÇÏɬ ÊÊå ÅÙÇÏÉ ÇäÊèÌêç ÈÍÓÈ ÊçêÆÉ Apache ÈèÇÓ×É
ÇäÊèÌêçÇÊ ÇäÊÇäêÉ:
</simpara>
<programlisting role="apache-conf"><![CDATA[
Action php-script /cgi-bin/php
AddHandler php-script .php
]]></programlisting>
<simpara>
çÐÇ ÇäÎêÇÑ âÏ Êå ÇÎÊÈÇÑç áâ× åÙ ÎÇÏå ÇäèêÈ Apache¬
èçè êÙÊåÏ Ùäé Apache åæ ÃÌä ÊÍÏêÏ åÊÚêÑ ÈêÆÉ CGI ÚêÑ ÇäâêÇÓê
<envar>REDIRECT_STATUS</envar> äÏé ×äÈêÇÊ ÅÙÇÏÉ ÇäÊèÌêç. ÅÐÇ
äå êãæ ÎÇÏåã ääèêÈ êÏÙå ÃêÉ ×ÑêâÉ ÅÎÈÇÑ Åæ ãÇæÊ Çä×äÈêÉ
åÈÇÔÑÉ Ãè åÙÇÏ ÊèÌêççǬ áäêÓ ÈåâÏèÑã ÇÓÊÙåÇä çÐÇ ÇäÎêÇÑ èêÌÈ Ùäêã ÇÓÊÙåÇä
ÅÍÏé Çä×Ñâ ÇäÃÎÑé åæ ÃÌä ÊÔÚêä ÅÕÏÇÑÉ CGI¬ ÇäåèËâÉ
çæÇ.
</simpara>
</sect2>
<sect2 id="security.cgi-bin.doc-root">
<title>ÇäÍÇäÉ 3: ÊÍÏêÏ doc_root Ãè user_dir</title>
<simpara>
ÃÍêÇæÇ¬ êÙÊÈÑ ÊÖåêæ åÍÊèé æÔê׬ åËä ÇäÓãÑêÈÊÇÊ èâÇÈäÇÊ ÇäÊæáêЬ áê
åÌäÏÇÊ ÇäåÓÊæÏÇÊ ÇäÎÇÕÉ ÈÎÇÏå ÇäèêÈ Ùäé Ãæç ååÇÑÓÉ ÚêÑ ÂåæÉ.
ÅÐÇ ÍÏË äÓÈÈ åǬ åËä Î×à áê ÇäÊçêÆÉ¬ Ãæ Êå
ÙÑÖ ÇäÓãÑêÈÊÇÊ Ùäé ÃæçÇ åÓÊæÏÇÊ HTML ÈÏäÇ åæ ÊæáêÐçǬ áêåãæ
Ãæ êæÊÌ Ùæ çÐÇ ãÔá ääåäãêÉ ÇäáãÑêÉ Ãè åÙäèåÇÊ ÃåæêÉ
åËä ãäåÇÊ ÇäåÑèÑ. èçãÐǬ áÅæ ÇäÙÏêÏ åæ åÏêÑê ÇäÃæØåÉ ÓêáÖäèæ
ÊæÕêÈ ÈæêÉ åÌäÏÇÊ ÃÎÑé åæ ÃÌä ÇäÓãÑêÈÊÇÊ
ÇäâÇÈäÉ ääèäèÌ áâ× åæ ÎäÇä PHP CGI¬ èÈÇäÊÇäê ÇäåïáÓñîÑîÉ
ÏèåÇ èÚêÑ ÇäåÙÑèÖÉ åËäåÇ çê.
</simpara>
<simpara>
ãÐä㬠ÅÐÇ äå ÊÊèáÑ ×ÑêâÉ ääÊÃãÏ åæ Ãæ Çä×äÈêÇÊ äÇ êÊå ÅÙÇÏÉ ÊèÌêççǬ
åËäåÇ èïÕðáîÊ áê Çäåâ×Ù ÇäÓÇÈâ¬
áÅæç åæ ÇäÖÑèÑÉ ÊÍÏêÏ ÌÐÑ èËÇÆâê (doc_root) ÎÇÕ ÈÇäÓãÑêÈÊÇÊ èêãèæ
åÎÊäáÇ Ùæ ÇäÌÐÑ ÇäèËÇÆâê ÇäÎÇÕ ÈÇäèêÈ.
</simpara>
<simpara>
êåãæã ÊÍÏêÏ ÇäÌÐÑ ÇäèËÇÆâê ÇäÎÇÕ ÈÓãÑêÈÊÇÊ PHP ÈèÇÓ×É
ÊèÌêç ÇäÊçêÆÉ <link linkend="ini.doc-root">doc_root</link> áê
<link linkend="configuration.file">åäá ÇäÊçêÆÉ</link>¬ Ãè ÍÊé
ÊÍÏêÏ åÊÚêÑ ÇäÈêÆÉ
<envar>PHP_DOCUMENT_ROOT</envar>. ÅÐÇ Êå ÊÍÏêÏç¬ áÅæ ÅÕÏÇÑÉ CGI
åæ PHP ÓÊâèå ÏèåÇ ÈÅæÔÇÁ ÅÓå Çäåäá ÈÚÑÖ ÇäÅæáÊÇÍ ÈèÇÓ×É
<parameter>doc_root</parameter> èåÙäèåÇÊ ÇäåÓÇÑ áê
Çä×äÈêɬ ÍÊé Êãèæ åÊÃãÏÇ åæ Ãæ èäÇ Ãê ÓãÑêÈÊ êÊå ÊæáêÐç ÎÇÑÌ çÐÇ
ÇäåÌäÏ (åÇ ÙÏÇ ÈÇäæÓÈÉ ä <parameter>user_dir</parameter>
áê ÇäÃÓáä).
</simpara>
<simpara>
ÎêÇÑ ÂÎÑ âÇÈä ääÅÓÊÙåÇä çè <link linkend="ini.user-dir">user_dir</link>. ÙæÏåÇ äÇ êÊå ÊÍÏêÏ user_dir¬
áÅæ ÇäÔêÁ ÇäèÍêÏ ÇäÐê êÊÍãå áê ÅÓå Çäåäá ÇäåáÊèÍ çè
<parameter>doc_root</parameter>. Åæ áÊÍ åÍÏÏ åèÑÏ åÊÔÇãä (url) åËä <filename role="url">http://my.host/~user/doc.php</filename> äÇ êÊÑÊÈ Ùæç
áÊÍ åäá ÊÍÊ åÌäÏ åè׿ ÇäåÓÊÎÏåêæ èÅæåÇ åäá
êÏÙé <filename role="uri">~user/doc.php</filename> ÊÍÊ
doc_root (æÙå¬ ÅÓå åÌäÏ êÈÊÏà È
[<literal>~</literal>]).
</simpara>
<simpara>
ÅÐÇ Êå ÊÍÏêÏ âêåÉ user_dir åËäÇ È <filename role="dir">public_php</filename>¬ áÅæ ×äÈêÉ åËä <filename role="url">http://my.host/~user/doc.php</filename> ÓÊáÊÍ
åäáÇ êÏÙé <filename>doc.php</filename> ÊÍÊ åÌäÏ
êÏÙé <filename role="dir">public_php</filename> ÊÍÊ ÇäåÌäÏ Çäåè׿
ÇäÎÇÕ ÈÇäåÓÊÎÏå. ÅÐÇ ãÇæ åè׿ ÇäåÓÊÎÏå çè <filename role="dir">/home/user</filename>¬ áÅæ Çäåäá ÇäåïæîáñîÐ çè
<filename>/home/user/public_php/doc.php</filename>.
</simpara>
<simpara>
êÍÏË ÊèÓñïÙ <parameter>user_dir</parameter> ÈÚÖ ÇäæØÑ Ùæ
ÅÙÏÇÏ Çä <parameter>doc_root</parameter>¬ èÈÇäÊÇäê¬ êåãæã ÇäÊÍãå
áê ÇäèäèÌ Åäé ÇäÌÐÑ ÇäèËÇÆâê èåÌäÏ ÇäåÓÊÎÏå
èÐäã ÈÔãä åæáÕä.
</simpara>
</sect2>
<sect2 id="security.cgi-bin.shell">
<title>ÇäÍÇäÉ 4: åáÓÑ PHP ÎÇÑÌ ÔÌÑÉ ÇäèêÈ</title>
<para>
ÎêÇÑ Âåæ ÌÏÇ çè èÖÙ ËæÇÆêÉ åáÓÑ PHP áê åãÇæ åÇ
ÎÇÑÌ ÔÌÑÉ ÇäèêÈ ÇäÎÇÕÉ ÈÇäåäáÇÊ. áê <filename role="dir">/usr/local/bin</filename>¬ åËäÇ. ÇäÓäÈêÉ ÇäáÙäêÉ ÇäèÍêÏÉ
ÇäåÑÊÈ×É ÈçÐÇ ÇäÎêÇÑ çê Ãæç ÓêÊèÌÈ ÇäÂæ èÖÙ Ó×Ñ
ÔÈêç ä:
<informalexample>
<programlisting><![CDATA[
#!/usr/local/bin/php
]]></programlisting>
</informalexample>
Ùäé Ãæç ÇäÓ×Ñ ÇäÃèä äÃê åäá êÊÖåæ èÓèå PHP. ÓÊÍÊÇÌ ÃêÖÇ
äÌÙä Çäåäá âÇÈäÇ ääÊæáêÐ. Ùäé çÐÇ ÇäåðæèÇä¬ ÊÙÇåä åÙ ÇäèÖÙ ÊåÇåÇ åËäåÇ
ÓÊÊÙÇåä åÙ Ãê ÓãÑêÈÊ CGI ãïÊðÈî ÈèÇÓ×É Perl Ãè sh Ãè Ãê
äÚÉ ÈÑåÌÉ ÓãÑêÈÊÇÊ ÃÎÑé Êãèæ åÃäèáÉ èÊÓÊÙåä
<literal>#!</literal>¬ ÂäêÉ ÊçÑÈ shell ÈÚÑÖ ÇäÅâäÇÙ
ÇäÐÇÊê.
</para>
<para>
äÌÙä PHP êÊÙÇåä åÙ åÙäèåÇ <envar>PATH_INFO</envar> è
<envar>PATH_TRANSLATED</envar> ÈÔãä ÕÍêÍ èÈÇäåèÇÒÇÉ åÙ çÐÇ
ÇäÊæÕêȬ áêÌÈ ÊÌåêÙ åïáÓñðÑ php èçè êÊÖåæ ÎêÇÑ ÊçêÆÉ <link linkend="install.configure.enable-discard-path">--enable-discard-path</link>.
</para>
</sect2>
</sect1>
<sect1 id="security.apache">
<title>ÇäÊËÈêÊ Ùäé Ôãä èÍÏÉ Apache</title>
<simpara>
ÙæÏ ÇÓÊÎÏÇå PHP Ùäé Ôãä èÍÏÉ Apache áÅæç êÑË ÊÑÇÎêÕ åÓÊÎÏå Apache
(ÃÕäǬ Êäã ÇäÎÇÕÉ ÈÇäåÓÊÎÏå "äÇ ÃÍÏ"). äçÐÇ ÙÏÉ
ÊÃËêÑÇÊ Ùäé ÇäÃåæ èÇäÊÎèêä. åËäǬ ÅÐÇ ãæÊ ÈÕÏÏ ÇÓÊÙåÇä
PHP åæ ÃÌä èäèÌ âÇÙÏÉ ÈêÇæÇʬ áÅæã¬ ÅäÇñ ÅÐÇ ãÇæÊ âÇÙÏÉ ÇäÈêÇæÇÊ ÊÊÖåæ ÊÍãå ÇäèäèÌ ÙæÏ ÇäÊÔêêϬ
Êãèæ åÖ×ÑÇ äÌÙä âÇÙÏÉ ÇäÈêÇæÇÊ âÇÈäÉ ääèäèÌ åæ âÈä
ÇäåÓÊÎÏå "äÇ ÃÍÏ". êÙæê çÐÇ Ãæ Ãê ÓãÑêÈÊ ÂËå êåãæç ÇäèäèÌ Åäé âÇÙÏÉ ÇäÈêÇæÇÊ
èÇäÊÙÏêä áêçǬ ÍÊé èäè ÈÏèæ ÅÓå åÓÊÎÏå èãäåÉ åÑèÑ. å×äâ ÇäÅåãÇæêÉ Êãèæ ÈåâÏèÑ
åïÊÊÈðÙ ÇäÔñïÙ ääÙËèÑ Ùäé ÇäÕáÍÉ ÇäÔñÙêñÉ ÇäÎÇÕÉ ÈåÏêÑ âÇÙÏÉ ÇäÈêÇæÇÊ
èÇäÇæâÖÇÖ Ùäé åÌåä âèÇÙÏ ÈêÇæÇÊã. êåãæã
ÇäÅÍÊåÇÁ åæ çÐÇ ÈèÇÓ×É ÊÎèêäÇÊ Apache Ãè ÈÊÕåêå
åðæòèÇä ÇäèäèÌ ÇäÎÇÕ Èã ÈÇÓÊÙåÇä LDAP¬ åäáÇÊ &htaccess;¬ ÅäÎ. èÊÖåêæ
çÐç ÇäÔêáÑÉ ãÌÒÁ åæ ÓãÑêÈÊÇÊ PHP ÇäÎÇÕÉ Èã.
</simpara>
<simpara>
áê ÇäÚÇäȬ ÙæÏåÇ êÊå ÅâÑÇÑ ÇäÃåæ ÙæÏ Çäæâ×É ÍêË ÊÑÊÈ× ÈåÓÊÎÏå PHP
(áê çÐç ÇäÍÇäɬ åÓÊÎÏå Apache) ÊÈÙÇÊ èÇçêɬ
ÓêÊå ÇãÊÔÇá Ãæ PHP ÃÕÈÍ Çäêèå ×ÙåÇ ÖÏ ãÊÇÈÉ ÃêÉ åäáÇÊ
áê åÌäÏÇÊ ÇäåÓÊÎÏåêæ. Ãè ÑÈåÇ Êå Ê×Ùêåç ÖÏ èäèÌ âèÇÙÏ ÇäÈêÇæÇÊ
Ãè ÇäÊÈÏêä áêçÇ. ÈÇäÊÓÇèê¬ âÏ Êå ÊÃåêæç ÖÏ ãÊÇÈÉ
åäáÇÊ Í èÓêÆÉ Ãè ÅÏÎÇä åÙÇåäÇÊ âèÇÙÏ-ÈêÇæêÉ Í èÓêÆÉ.
</simpara>
<simpara>
çæÇã Î×à Ãåæê ÔÇÆÙ êÊå ÇÑÊãÇÈç ÙæÏ çÐç Çäæâ×É èêÊåËä áê ÇäÓåÇÍ
ÈÊÑÇÎêÕ ÌÐÑ Apache Ãè ÊÑâêÉ âÇÈäêÇÊ Apache È×ÑêâÉ
åÇ.
</simpara>
<simpara>
ÊÊÓå ÊÑâêÉ ÊÑÇÎêÕ åÓÊÎÏå Apache äÏÑÌÉ "ÌÐÑ - root" ÈãèæçÇ áÇÆâÉ
ÇäÎ×èÑÉ èêåãæçÇ ÊÙÑêÖ Ç俨Çå ÈÃãåäç ääÎ×Ѭ äÐäã áÅæ âÇÈäêÇÊ ÇÓÊÎÏÇå sudo¬
chroot Ãè Ãê ÔêÁ ÂÎÑ åæ åæ×äâ ÇäÌÐÑ äÇ êÌÈ Ãæ ÊÄÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ åæ ÃÌä
ÃèäÆã ÇäÐêæ äÇ êÙÊÈÑèæ ÃÎÕÇÆêê Ãåæ.
</simpara>
<simpara>
çæÇã ÈÖÙÉ Íäèä ÃÈÓ×. åæ ÎäÇä ÇÓÊÙåÇä
<link linkend="ini.open-basedir">open_basedir</link>¬ êåãæã åÑÇâÈÉ èÍÕÑ Ãê
ÇäåÌäÏÇÊ êïÓòåîÍï ÈÇÓÊÙåÇäçÇ áê PHP. êåãæã ÃêÖÇ ÊÙêêæ
åæÇ×â ÍÕÑêÉ Ùäé Apache¬ ÈÚÑÖ ÍÕÑ ãä ÇäæÔÇ× ÇäÔñïÙê ÇäâèÇå Ùäé ÚêÑ-ÇäåÓÊÎÏå (non-user)¬
Ãè ÚêÑ-Ç俨Çå (non-system)¬ ÇäåäáÇÊ.
</simpara>
</sect1>
<sect1 id="security.filesystem">
<title>Ãåæ æØÇå ÇäåäáÇÊ</title>
<simpara>
êÊÃËÑ PHP ÈÇäÃåæ ÇäåïÔñîêñîÏ Öåæ åÙØå ÃæØåÉ ÇäÎÇÏå
ÈÇäÊèÇáâ åÙ ÇäÊÑÇÎêÕ ÇäâÇÆåÉ Ùäé ÃÓÇÓ ÇäåäáÇÊ èÇäåÌäÏÇÊ. êÓåÍ çÐÇ
äã ÈåÑÇâÈÉ Ãê ÇäåäáÇÊ Öåæ æØÇå ÇäåäáÇÊ êåãæ âÑÇÁÊçÇ. êÌÈ ÇäÍÐÑ
åÙ Ãê åäáÇÊ âÇÈäÉ ääâÑÇÁÉ åæ âðÈîäð Çäãñïä äÖåÇæ
ÃæçÇ åèËèâÉ äÊìâòÑîÃ åæ âÈä ãä ÇäåÓÊÎÏåêæ ÇäÐêæ ÈåâÏèÑçå èäèÌ çÐÇ
Ç俨Çå ÇäåäáÇÊê.
</simpara>
<simpara>
åæÐ Ãæ Êå ÊÕåêå PHP ääÓåÇÍ ÈÇäèäèÌ ÈåÓÊèé ÇäåÓÊÎÏå Åäé Ç俨Çå ÇäåäáÇÊê¬
ÃÕÈÍ Èå×äâ ÇäÅåãÇæêÉ ãÊÇÈÉ ÓãÑêÈÊ PHP êÓåÍ äã
ÈâÑÇÁÉ åäáÇÊ Ç俨Çå åËä /etc/passwd¬ ÊÙÏêä ÇÊÕÇäÇÊ ethernet ÇäÎÇÕÉ Èã¬
ÅÑÓÇä ÃÔÚÇä ×ÈÇÙÉ ÌåÇÙêɬ ÅäÎ. êÊÖåæ çÐÇ ÈÙÖ
ÇäÅÔÊÑÇ×ÇÊ ÇäÌäêñÉ åæ ÍêË Ãæã ÊÍÊÇÌ ääÊÃãÏ Ãæ ÇäåäáÇÊ
ÇäÊê ÊâÑà åæçÇ èÊãÊÈ áêçÇ çê ÇäåäáÇÊ Çäå×ÇÈâÉ.
</simpara>
<simpara>
ÅÙÊÈÑ ÇäÓãÑêÈÊ ÇäÊÇäê ÍêË êÔêÑ åÓÊÎÏå Åäé Ãæç
êîèñîÏï ÍÐá åäá åæ åÌäÏç Çäåè׿ê. êáÊÑÖ çÐÇ
èÖÙêÉ åÙêæÉ ÍêË ÊÊÓå ÇäèÇÌçÉ ÇäÔñïÙêñîÉ ÇäÎÇÕÉ È PHP ÈãèæçÇ åÓÊÙåäÉ ÈÔãä ÏèÑê ÈÚÑÖ ÊÓêêÑ
ÇäåäáÇÊ èÍêË êãèæ åÓåèÍÇ äåÓÊÎÏå Apache ÈÍÐá åäáÇÊ
áê ÇäåÌäÏÇÊ Çäåè׿êÉ ääåÓÊÎÏå.
</simpara>
<para>
<example>
<title>ÊáâÏ åÊÚêÑ åïÙòÊîä êÄÏê Åäé...</title>
<programlisting role="php"><![CDATA[
<?php
// æÒÙ åäá åæ ÇäåÌäÏ Çäåè׿ê ÇäÎÇÕ ÈÇäåÓÊÎÏå
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");
echo "Êå ÍÐá $file_to_delete!";
?>
]]></programlisting>
</example>
åæÐ ÇäèçäÉ ÇäÊê êãèæ áêçÇ ÅÓå ÇäåÓÊÎÏå âÇÈäÇ ääÅêÏÇÙ Åæ×äÇâÇ åæ æåèÐÌ åÓÊÎÏå¬ êãèæ ÈÇäÅåãÇæ ÊåÑêÑ
ÅÓå åÓÊÎÏå èåäá êåäãç ÔÎÕ ÂÎÑ èÈÇäÊÇäê ÍÐá ÇäåäáÇÊ.
áê çÐç ÇäÍÇäɬ ÓÊÑÚÈ áê ÇÓÊÙåÇä ÈÙÖ ÃÔãÇä ÃÎÑé äÙåäêÉ ÊÏâêâ ÇäçèêÉ.
ÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ åÇ êåãæ Ãæ êÍÏË ÅÐÇ ãÇæÊ ÇäåÊÚêÑÇÊ ÇäåïåîÑñîÑîÉ
"../etc/" è "passwd". ÍêæçÇ ÓÊåå âÑÇÁÉ ÇäÔêáÑÉ ÈÔãä áÙäê:
<example>
<title>... çÌèå Ùäé Ç俨Çå ÇäåäáÇÊê</title>
<programlisting role="php"><![CDATA[
<?php
// æÒÙ åäá åæ Ãê åãÇæ Ùäé ÇäâÑÕ ÇäÕäÈ êãèæ
// ÈåâÏèÑ åÓÊÎÏå PHP èäèÌç. ÅÐÇ ãÇæ ÈÍèÒÉ PHP ÇäèäèÌ ÇäÌÐÑê:
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "äâÏ Êå ÍÐá /home/../etc/passwd !";
?>
]]></programlisting>
</example>
çæÇã ÊÏÈêÑêæ çÇåêæ Ùäêã ÇÊÎÇÐçåÇ åæ ÃÌä ÊáÇÏê çÐç
ÇäåÓÇÆä:
<itemizedlist>
<listitem>
<simpara>
áâ× ÅÓåÍ ÈÇäÊÑÇÎêÕ ÇäåÍÏèÏÉ äËæÇÆêÉ ÇäåÓÊÎÏå ÇäÔñïÙêñ ä PHP.
</simpara>
</listitem>
<listitem>
<simpara>
ÊáâñîÏ ãä ÇäåÊÚêÑÇÊ ÇäÊê êÊå ÊåÑêÑçÇ.
</simpara>
</listitem>
</itemizedlist>
çæÇ ÊÌÏ ÓãÑêÈÊ åïÍÓñîæ:
<example>
<title>ÊáâÏ ÃãËÑ ÃåæÇ äÅÓå Çäåäá</title>
<programlisting role="php"><![CDATA[
<?php
// æÒÙ åäá åæ ÇäâÑÕ ÇäÕäÈ êãèæ
// ÈåâÏèÑ åÓÊÎÏå PHP ÇäèäèÌ Åäêç.
$username = $_SERVER['REMOTE_USER']; // ÈÇÓÊÙåÇä ÂäêÉ ÊÏâêâ ÇäçèêÉ
$homedir = "/home/$username";
$file_to_delete = basename("$userfile"); // åÓÇÑÇÊ åæÒèÙÉ
unlink ($homedir/$file_to_delete);
$fp = fopen("/home/logging/filedelete.log","+a"); //ÊÏèêæ ÇäÍÐá
$logstring = "$username $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);
echo "äâÏ Êå ÍÐá $file_to_delete !";
?>
]]></programlisting>
</example>
åÙ Ðä㬠áÍÊé çÐÇ äÇ êÎäè åæ ÇäæâÇÆÕ. ÅÐÇ ãÇæ æØÇå ÊÏâêâ ÇäçèêÉ äÏêã
êÓåÍ ääåÓÊÎÏåêæ ÈÎäâ åïÏèæÇÊ ÏÎèä åÓÊÎÏå ÎÇÕÉ Èçå¬ èÇÎÊÇÑ ÃÍÏ ÇäåÓÊÎÏåêæ
åïÏèðæÉ ÇäÏÎèä "../etc/"¬ áÅæ Ç俨Çå êÕÈÍ åÑÉ ÃÎÑé åïÙÑñÖÇ. äçÐÇ
ÇäÓÈȬ ÑÈåÇ Ãæã ÊáÖä ÇäãÊÇÈÉ åæ ÃÌä ÇäÍÕèä Ùäé ÊáâÏ ÃãËÑ ÔÎÕæÉ:
<example>
<title>ÊáâÏ ÃãËÑ ÃåæÇ äÅÓå Çäåäá</title>
<programlisting role="php"><![CDATA[
<?php
$username = $_SERVER['REMOTE_USER']; // ÈÇÓÊÙåÇä ÂäêÉ ÊÏâêâ ÇäçèêÉ
$homedir = "/home/$username";
if (!ereg('^[^./][^/]*$', $userfile))
die('bad filename'); //ÅåÇÊɬ ÙÏå ÇäåÙÇäÌÉ
if (!ereg('^[^./][^/]*$', $username))
die('bad username'); //ÅåÇÊɬ ÙÏå ÇäåÙÇäÌÉ
//etc...
?>
]]></programlisting>
</example>
</para>
<para>
ÈÍÓÈ æØÇåã ÇäÊÔÚêäê¬ ÊèÌÏ ÊÔãêäÉ èÇÓÙÉ åæ ÇäåäáÇÊ
ÇäÊê êÌÈ Ãæ ÊçÊå ÈÎÕèÕçǬ ÈåÇ áê åÏÇÎä ÇäÃÌçÒÉ (/dev/
Ãè COM1)¬ åäáÇÊ ÇäÊçêÆÉ (åäáÇÊ /etc/ èåäáÇÊ .ini)¬
åæÇ×â ÊÎÒêæ ÇäåäáÇÊ ÇäåÙÑèáÉ ÌêÏÇ (/home/¬ ÇäåÓÊæÏÇÊ)¬ ÅäÎ. äçÐÇ
ÇäÓÈȬ áÅæç áê ÇäÙÇÏÉ åæ ÇäÃÓçä Îäâ ÓêÇÓÉ ÍêË ÊîÍòØïÑ
ãä ÔêÁ åÇ ÙÏÇ åÇ ÊÓåÍ Èç ÕÑÇÍÉ.
</para>
</sect1>
<sect1 id="security.database">
<title>Ãåæ âÇÙÏÉ ÇäÈêÇæÇÊ</title>
<simpara>
áê çÐç ÇäÃêÇå¬ ÊÊÓå âèÇÙÏ ÇäÈêÇæÇÊ ÈãèæçÇ åãèæÇÊ ÑÆêÓêÉ äÃê Ê×Èêâ ÔïÙêñ ÇäâðèÇå åæ ÎäÇä
ÊáÙêäçÇ âÇÈäêÉ ÇäåèÇâÙ ÇäÔñïÙêñîÉ ääÊÒèêÏ ÈåÖåèæ Íêèê åÊæèÙ. ÍÊé ÇäåÙäèåÇÊ ÇäÌÏ ÍÓÇÓÉ
Ãè ÇäÓñÑêñÉ êåãæ ÊÎÒêçÇ áê åËä çÐç ÇäâÇÙÏÉ ÇäÈêÇæêɬ äÐäã Ùäêã ÇäÃÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ èÈâèÉ
åÓÃäÉ ÍåÇêÊçÇ È×ÑêâÉ Ãè ÈÃÎÑé.
</simpara>
<simpara>
åæ ÃÌä ÇÓÊÑÌÇÙ Ãè ÊÎÒêæ ÃêÉ åÙäèåɬ ÊÍÊÇÌ ääÅÊÕÇä ÈâÇÙÏÉ ÇäÈêÇæÇʬ
ÅÑÓÇä ÅÓÊáçÇå åÔÑèÙ¬ ÅÓÊÍÖÇÑ ÇäæÊêÌÉ èÅÚäÇâ ÇäÅÊÕÇä.
áê çÐç ÇäÃêÇå¬ äÚÉ ÇäÅÓÊáçÇå ÇäåÓÊÙåäÉ ÈÔãä åÃäèá áê çÐÇ ÇäÊáÇÙä çê
äÚÉ ÇäÅÓÊáçÇå Çäåïçêãä (SQL). ÅÓÊÙÑÖ ãêá êÓÊ×êÙ åçÇÌå <link linkend="security.database.sql-injection">ÇäÊäÇÙÈ ÈÇÓÊáçÇå SQL</link>.
</simpara>
<simpara>
åËäåÇ êåãæã ÊÕèÑç¬ äÇ êÓÊ×êÙ PHP ÍåÇêÉ âÇÙÏÉ ÈêÇæÇÊã ÈÐÇÊç.
ÇäåâÇ×Ù ÇääÇÍâÉ Ê×åÍ äÃæ Êãèæ åâÏåÉ âÇÙÏêÉ ÈÎÕèÕ ãêáêÉ
ÇäèäèÌ èÇäÊÙÇåä åÙ âèÇÙÏ ÇäÈêÇæÇÊ Öåæ ÓãÑêÈÊÇÊ PHP.
</simpara>
<simpara>
ÊÐãÑ çÐç ÇäâÇÙÏÉ ÇäÈÓê×É: ÇäÏáÇÙ åæ ÇäÙåâ. áê ÇäåãÇæ ÇäÐê
ÊæÔ× áêç ÃãËÑ åæ ÃÌä ÊÏÙêå ÍåÇêÉ âÇÙÏÊã ÇäÈêÇæêɬ ááêç Êãèæ
ÅÍÊåÇäÇÊ Ãæ êïãäñîä åçÇÌå åÇ ÈÇäæÌÇÍ èêÓÊÙÑÖ Ãè êÊÙÓá åÙ ÃêÉ åÙäèåÇÊ ÓÑêÉ åïÎîÒñîæîÉ Ãâä.
ÇäÊÕåêå ÇäÌêñðÏ äÊÎ×ê× âÇÙÏÉ ÇäÈêÇæÇÊ èãÐÇ ÇäÈÑæÇåÌ
çè ÇäÐê êÊÙÇ×é åÙ ÃÙØå åÎÇèáã.
</simpara>
<sect2 id="security.database.design">
<title>ÊÕåêå âèÇÙÏ ÇäÈêÇæÇÊ</title>
<simpara>
ÇäÎ×èÉ ÇäÃèäé çê ÏÇÆåÇ Îäâ âÇÙÏÉ ÇäÈêÇæÇʬ ÅäÇ ÅÐÇ ãæÊ ÊèÏ ÇÓÊÙåÇä
âÇÙÏÉ ÈêÇæÇÊ åèÌèÏÉ èååäèãÉ ä×Ñá åÚÇêÑ. ÙæÏ Îäâ âÇÙÏÉ ÈêÇæÇʬ êÊå
ÊÙêêæçÇ äåÇäã åǬ Ðäã ÇäÐê æáÐ ÈäÇÚ ÇäÎäâ. áê ÇäÙÇÏɬ áâ×
ÇäåÇäã (Ãè ÇäåÓÊÎÏå ÇäÃÙØå) êåãæç ÇäâêÇå Èãä åÇ êÑêÏ ÈÇäãÇÆæÇÊ áê Êäã
ÇäâÇÙÏÉ ÇäÈêÇæêɬ èåæ ÃÌä ÇäÓåÇÍ ääåÓÊÎÏåêæ ÇäÂÎÑêæ ÈÇÓÊÙåÇäçǬ áêÌÈ
åæÍç ÇåÊêÇÒÇÊ Ðäã.
</simpara>
<simpara>
äÇ êÌÈ ÈÊÇÊÇ Ãæ ÊÊÕä ÇäÊ×ÈêâÇÊ ÈâÇÙÏÉ ÇäÈêÇæÇÊ Ùäé ÃæçÇ åîÇäðã
Ãè åÓÊÎÏå ÃÙØå äÃæ çÄäÇÁ ÇäåÓÊÎÏåêæ êåãæçå ÊæáêÐ Ãê ÇÓÊáçÇå äåÌÑÏ ÇäÑÚÈɬ åËäÇ:
ÊÙÏêä ÇäÊÎ×ê× (åËä ÇæÊÒÇÙ ÌÏÇèä) Ãè ÍÐá
åÌåä åÖåèæçÇ.
</simpara>
<simpara>
ÈÅåãÇæã Îäâ åÓÊÎÏåêæ åÎÊäáêæ äâÇÙÏÉ ÇäÈêÇæÇÊ ÈÍÓÈ ãä åØçÑ åæ åØÇçÑ
Ê×Èêâã ÈÍâèâ åÍÏèÏÉ Ùäé ãÇÆæÇÊ ÇäâÇÙÏÉ ÇäÈêÇæêÉ. ÃãËÑ
ÇäÅåÊêÇÒÇÊ ×äÈÇ çê áâ× ÇäÊê êÌÈ åæÍçÇ ãåÇ êÌÈ ÊáÇÏê Ãæ
êÊåãæ æáÓ ÇäåÓÊÎÏå åæ ÇäÊáÇÙä åÙ ÇäâÇÙÏÉ ÇäÈêÇæêÉ áê ÍÇäÇÊ ÇÓÊÎÏÇå åÎÊäáÉ. êÙæê çÐÇ Ãæç ÅÐÇ
æÌÍ åÊÓääèæ áê ÇäèäèÌ Åäé âÇÙÏÊã ÇäÈêÇæêÉ ÈÇÓÊÙåÇä ÅÍÏé çÐç ÇäÅÓÊÙåÇäÇʬ
áÅæ ÇäÊÚêêÑÇÊ ÇäÊê êÓÊ×êÙèæ ÅÍÏÇËçÇ çê áâ× ÈåâÏÇÑ ÅÓÊ×ÇÙÉ ÇäÊ×Èêâ.
</simpara>
<simpara>
äÇ æïÔÏñðÏ ÙÒåã Ùäé ÅÏÑÇÌ ãä Çäåæ×â ÇäÙåäê áê ÇäÊ×Èêâ
ÇäÔñÙêñ (Ãê ÇäÓãÑêÈÊ ÇäÎÇÕ Èã)¬ ãÈÏêä ääâêÇå ÈÐäã ÙæÏ ÊÎ×ê× ÇäâÇÙÏÉ ÇäÈêÇæêÉ
åæ ÎäÇä ÇÓÊÙåÇä ÇäåÔÇçϬ ÇäÒðæÇÏÇÊ Ãè ÇäâèÇÙÏ. ÅÐÇ Ê×èÑ Ç俨Çå¬ áÅæ åæÇáÐ ÌÏêÏÉ Åäé ÇäâÇÙÏÉ ÇäÈêÇæêÉ
Óêïæòèîé áÊÍçÇ èÓêÊèÌÈ Ùäêã ÅÙÇÏÉ ÅÏÑÇÌ Çäåæ×â
Öåæ ãä ÒÈèæ åæáÕä ääâÇÙÏÉ ÇäÈêÇæêÉ. ÙäÇèÉ Ùäé Ðä㬠áÅæç êåãæ ÇÓÊÙåÇä ÇäÒæÇÏÇÊ
ÈÚÑÖ ÇäÊÙÇåä åÙ ÇäÍâèä ÈÕèÑÉ ÔáÇáÉ èÂäêÉ ååÇ êÒêÏ ÚÇäÈÇ áê
ÇäÊÈÕñïÑ ÙæÏ åÔÇãä ÅÒÇäÉ ÇäÙðää ÈÊ×Èêâã Ãè ÙæÏ ÇäÊñîÊÈñïÙ ÇäÑÌÙê
ääåÙÇåäÇÊ.
</simpara>
</sect2>
<sect2 id="security.database.connection">
<title>ÇäÅÊÕÇä ÈÇäâÇÙÏÉ ÇäÈêÇæêÉ</title>
<simpara>
ÑÈåÇ ÊèÏ ÅÊåÇå ÇäÅÑÊÈÇ×ÇÊ ÙÈÑ ×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ (SSL) äÊÔáêÑ
ÇäÅÊÕÇäÇÊ ÇäÒÈèæ/ÇäÎÇÏå ÈÚÑÖ ÇäÍÕèä Ùäé Ãåæ åïÙîÒñîÒ Ãè ÍÊé êåãæã ÇÓÊÙåÇä ssh
äÊÔáêÑ ÇäÑÈ× ÇäÔÈãêñ Èêæ ÇäÒÈÇÆæ èÎÇÏå ÇäâÇÙÏÉ ÇäÈêÇæêÉ.
ÅÐÇ Êå ÇäâêÇå ÈÅÍÏé ÇäÎ×èÊêæ¬ áÅæ ÇäÊÍãå áê ÇäåÑèÑ èÇÓÊÍÕÇä
ÇäåÙäèåÇÊ ÈçÐç Çä×ÑêâÉ ÓêÔãä ÙåäÇ ÔÇâÇ.
</simpara>
<!--simpara>
ÅÐÇ ãÇæ ÎÇÏå âÇÙÏÊã ÇäÈêÇæêÉ êÊèáÑ Ùäé ÏÙå ÃÕäê ä×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ (SSL)¬ áÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ åÓÃäÉ ÇÓÊÙåÇä <link
linkend="ref.openssl">ÏèÇä OpenSSL</link> áê ÇäÅÊÕÇä Èêæ
PHP èÇäâÇÙÏÉ ÇäÈêÇæêñÉ ÙÈÑ ×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ (SSL).
</simpara-->
</sect2>
<sect2 id="security.database.storage">
<title>×ÑÇÒ ÇäÊÎÒêæ ÇäåïÔáñîÑ</title>
<simpara>
Êâèå ×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ / SSH ÈÍåÇêÉ ÓáÑ ÇäÈêÇæÇÊ åæ ÙæÏ ÇäÒÈèæ Åäé ÇäÎÇÏå» ×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ / SSH
äÇ Êâèå ÈÍåÇêÉ ÇäÈêÇæÇÊ ÇäåÏÇèåÉ ÇäåÎÒæÉ áê âÇÙÏÉ ÈêÇæêñÉ åÇ. ÊÊÓå ×ÈâÉ ÇäèÕäÉ ÇäÂåæÉ (SSL) ÈãèæçÇ
ÙÈÇÑÉ Ùæ åÑÇÓêå ÓðäãêñÉ ÇäâèÇå.
</simpara>
<simpara>
ÈåÌÑÏ åÇ êïáòäðÍ åçÇÌå åÇ áê ÇäèäèÌ ÇäåÈÇÔÑ Åäé âÇÙÏÊã ÇäÈêÇæêÉ (ÊÌÇèÒ
ÇäÎÇÏå ÇäÔñÙêñ)¬ áÅæ ÇäÈêÇæÇÊ ÇäÍÓÇÓÉ ÇäåÎÒæÉ êåãæ Ãæ ÊÕÈÍ ÖÍêÉ ääÙÑÖ Ãè äÓèÁ ÇäÅÓÊÙåÇä¬ ÅäÇ
ÅÐÇ ÊåÊ ÍåÇêÉ ÇäåÙäèåÇÊ åæ âÈä ÇäâÇÙÏÉ ÇäÈêÇæêñÉ æáÓçÇ. Åæñ ÊÔáêÑ ÇäÈêÇæÇÊ
çè ×ÑêâÉ ÌêñÏÉ äÊÎáêá ÇäÊçÏêÏ äãæ âäêäÉ çê ÇäâèÇÙÏ ÇäÈêÇæêÉ ÇäÊê ÊèáÑ çÐÇ
ÇäæèÙ åæ ÇäÊÔáêÑ ÇäÈêÇæê.
</simpara>
<simpara>
ÃÓçä ×ÑêâÉ äÍäñ çÐç ÇäåÔãäÉ çê ÃèäÇ ÅæÔÇÁ
ÍÒåÊã ÇäÊÔáêÑêñÉ ÇäÎÇÕÉ èåæ Ëå ÇÓÊÙåÇäçÇ Öåæ ÓãÑêÈÊÇÊ PHP ÇäÎÇÕÉ Èã. êåãæ ä PHP Ãæ ÊÙêæã¬
áê çÐç ÇäÍÇäɬ ÈÊèÓÙÇÊçÇ ÇäÙÏêÏɬ åËä <link linkend="ref.mcrypt">Mcrypt</link> è <link linkend="ref.mhash">Mhash</link>¬ ÇäÊê ÊÔÊåä ÊÔãêäÉ èÇÓÙÉ åæ
ÎèÇÑÒåêÇÊ ÇäÊñÔáêÑ. êâèå ÇäÓãÑêÈÊ ÈÊÔáêÑ ÇäÈêÇæÇÊ ÇäåèÌçÉ ääÊÎÒêæ ÃèäÇ èÅÒÇäÉ ÊÔáêÑçÇ
ÙæÏ ÇäÅÓÊÑÏÇÏ. Å×äÙ Ùäé ÇäåèÇÑÏ åæ ÃÌä ÇäÍÕèä Ùäé ÃåËäÉ ÃãËÑ ÈÎÕèÕ
ãêáêÉ Ùåä ÇäÊÔáêÑ.
</simpara>
<simpara>
áê ÍÇäÉ ÈêÇæÇÊ åÎáêÉ áÙäǬ èÅÐÇ ãÇæ ÊåËêäçÇ ÇäÎÇå äÇ êïÍÊÇÌ Åäêç
(Ãê äÇ ÊïÙòÑîÖ)¬ áêåãæ ääÊÌÒÆÉ ÃêÖÇ Ãæ ÊïÃÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ.
åËÇä ÇäÊÌÒÆÉ ÇäåÙÑèá ÌêÏÇ çè ÊÎÒêæ ÊÌÒÆÉ MD5 ÇäÎÇÕÉ
ÈãäåÉ åÑèÑ áê âÇÙÏÉ ÈêÇæêɬ ÈÏäÇ åæ ãäåÉ ÇäåÑèÑ æáÓçÇ. Å×äÙ ÃêÖÇ Ùäé
<function>crypt</function> è <function>md5</function>.
</simpara>
<example>
<title>ÅÓÊÙåÇä Íâä ãäåÉ ÇäåÑèÑ ÇäåÌÒÃÉ</title>
<programlisting role="php"><![CDATA[
// ÊÎÒêæ ÊÌÒÆÉ ãäåÉ ÇäåÑèÑ
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
addslashes($username), md5($password));
$result = pg_exec($connection, $query);
// ÇäÅÓÊáçÇå ÅÐÇ âÇå ÇäåÓÊÎÏå ÈÊåÑêÑ ãäåÉ ÇäåÑèÑ ÇäÕÍêÍÉ
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
addslashes($username), md5($password));
$result = pg_exec($connection, $query);
if (pg_numrows($result) > 0) {
echo "Welcome, $username!";
}
else {
echo "áÔä ÇäÊÍââ åæ çèêÉ $username.";
}
]]></programlisting>
</example>
</sect2>
<sect2 id="security.database.sql-injection">
<title>ÍâæÉ SQL</title>
<simpara>
ÇäÙÏêÏ åæ Çäå×èÑêæ ÇäÔñïÙêñêæ ÚêÑ ÏÇÑãêæ ääãêáêÉ ÇäÊê êåãæ ÈçÇ ÇäÊäÇÙÈ ÈÇÓÊáçÇåÇÊ SQL
èêÒÙåèæ Ãæ ÇÓÊáçÇå SQL çè ÃåÑ åèËèâ åæç. êÙæê çÐÇ Ãæ
ÇÓÊáçÇåÇÊ SQL ÈÇÓÊ×ÇÙÊçÇ ÇäÊÍÇêä Ùäé ÊÍãåÇÊ ÇäèäèÌ èåæ çæÇ ÊÌÇèÒ ÇäÊÍââ ÇäåâêÇÓê åæ ÇäçèêÉ
èÊáâÏÇÊ ÇäÊÎèêä èÃÍêÇæÇ¬ ÍÊé ÇÓÊáçÇåÇÊ SQL
êåãæçÇ ÇäÓåÇÍ ÈÇäèäèÌ Åäé ÃèÇåÑ åÓÊèé æØÇå ÇäÊÔÚêä ÇäåÖêá.
</simpara>
<simpara>
Íâæ ÃåÑ SQL åÈÇÔÑ çè ÙÈÇÑÉ Ùæ ÊâæêÉ êâèå ÇäåçÇÌå áêçÇ ÈÅæÔÇÁ Ãè
ÊÍèêÑ ÃèÇåÑ SQL åèÌèÏÉ åæ ÃÌä ÙîÑòÖ ÈêÇæÇÊ åÎáêÉ Ãè ÓÍâ åÙäèåÇÊ ËåêæÉ
Ãè ÍÊé ÊæáêÐ ÃèÇåÑ Î×êÑÉ åæ åÓÊèé Ç俨Çå Ùäé åÖêá ÇäâÇÙÏÉ ÇäÈêÇæêÉ.
êÊå çÐÇ Ùäé êÏ ÇäÊ×Èêâ ÈÊæÇèäç äåïÏÎä ÇäåÓÊÎÏå Ëå
ÏåÌç ÅêÇç ÈÇäåïÙòäîåîÇÊ ÇäËÇÈÊÉ ÈÚÑÖ ÊÔêêÏ ÅÓÊáçÇå SQL. ÇäÃåËäÉ
ÇäÊÇäêÉ Êâèå Ùäé ÃÓÇÓ âÕÕ Íâêâêɬ ääÃÓá.
</simpara>
<para>
æØÑÇ äæâÕ áê ÊÕÏêâ ÇäåïÏÎä èÙæÏ ÇäÅÊÕÇä ÈÇäâÇÙÏÉ ÇäÈêÇæêÉ
èãÃæç ÇäåÓÊÎÏå ÇäÃÙØå Ãè ÃÍÏ ÇäÐêæ ÈÅåãÇæçå ÅæÔÇÁ ÇäåÓÊÎÏåêæ¬ êåãæ ääåçÇÌå
Ãæ êïæòÔðÆ åÓÊÎÏåÇ ÃÙØåÇ áê âÇÙÏÊã ÇäÈêÇæêÉ.
<example>
<title>
ÊâÓêå åÌåèÙÉ ÇäæÊÇÆÌ Ùäé ÕáÍÇÊ... èÅÍÏÇË åÓÊÎÏåêæ ÃÙÇØå
(PostgreSQL è MySQL)
</title>
<programlisting role="php"><![CDATA[
$offset = argv[0]; // ÍÐÇÑê¬ äÇ ÊÕÏêâ Ùäé ÇäåïÏÎîä!
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// with PostgreSQL
$result = pg_exec($conn, $query);
// Èà MySQL
$result = mysql_query($query);
]]></programlisting>
</example>
êÖÚ× ÇäåÓÊÎÏåèæ ÇäÙÇÏêñèæ Ùäé ÑèÇÈ× 'äÇÍâ'¬ 'ÓÇÈâ' ÍêË Êãèæ <varname>$offset</varname>
åïÔáñÑÉ Öåæ åÍÏÏ ÇäåèÑÏ ÇäåÊÔÇãä. ÇäÓãÑêÈÊ êÊèâÙ Ãæ
<varname>$offset</varname> ÇäèÇÑÏÉ çê ÙÈÇÑÉ Ùæ ÙÏÏ ÙÔÑê. åÙ Ðä㬠ÍÇèä ÃÍÏçå
ãÓÑç ÈÅäÍÇâ ÇäÊÇäê Ùäé Ôãä <function>urlencode</function>
ÈåÍÏÏ ÇäåèÑÏ ÇäåÊÔÇãä
<informalexample>
<programlisting><![CDATA[
// áê ÍÇäÉ PostgreSQL
0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
select 'crack', usesysid, 't','t','crack'
from pg_shadow where usename='postgres';
--
// áê ÍÇäÉ MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;
]]></programlisting>
</informalexample>
ÅÐÇ ÍÕä¬ ÙæÏçÇ ÓêïâÏðå ÇäÓãÑêÈÊ äç èäèÌ åÓÊÎÏå ÃÙØå.
ÊÐãÑ Ãæ <literal>0;</literal> çê äÇÓÊÈÏÇä ÇäÅÓÊáçÇå ÇäÃÕäê ÈÅÒÇÍÉ ÕÇäÍÉ
èÅæçÇÆç.
</para>
<note>
<para>
Åæ ÅÌÈÇÑ åÙÇäÌ SQL Ùäé ÊÌÇçä ÈâêÉ ÇäÅÓÊáçÇå ÇäåãÊèÈ åæ âÈä
Çäå×èÑ çè ÊâæêÉ åÃäèáÉ. çÐÇ ÇäÊÌÇçä êÊå ÈèÇÓ×É <literal>--</literal>
ÇäÊê áê SQL¬ çê ÙÈÇÑÉ Ùæ ÙäÇåÉ ÊÙäêâ.
</para>
</note>
<para>
çæÇã ×ÑêâÉ ååãæÉ äÇÓÊÍÕÇä ãäåÇÊ ÇäåÑèÑ ÊÊåËä áê ÇäÊÍÇêä Ùäé ÕáÍÇÊã äæÊÇÆÌ ÇäÈÍË.
åÇ êÍÊÇÌ Åäêç ÇäåçÇÌå áâ× çè åÍÇèäÉ åÙÑáÉ ÅÐÇ ãÇæ çæÇã Ãê åÊÚêÑ åïåÑñîÑ
êÊå ÇÓÊÙåÇäç áê ÈäÇÚ SQL èäÇ êÊå ÇäÊÙÇåä åÙç ÈÇäÔãä ÇäåäÇÆå. áê ÇäÙÇÏɬ çÐç ÇäåïÑîÔðÍÇÊ êåãæ ÊÍÏêÏçÇ
áê æåèÐÌ åïÓòÈîâ äÔÎÕæÉ ÈæèÏ <literal>WHERE¬ ORDER BY¬
LIMIT</literal> è <literal>OFFSET</literal> áê ÈäÇÚÇÊ <literal>SELECT</literal>.
ÅÐÇ ãÇæÊ âÇÙÏÊã ÇäÈêÇæêñÉ ÊÏÙå ÈæÇÁ <literal>UNION</literal>¬
áêåãæ ääåçÇÌå Ãæ êÍÇèä ÅäÍÇâ ÇÓÊáçÇå ãÇåä ÈÇäÅÓÊáçÇå ÇäÃÕäê ÈÚÑÖ ÙÑÖ äÇÆÍÉ
ãäåÇÊ ÇäåÑèÑ Åæ×äÇâÇ åæ ÌÏèä ÅÙÊÈÇ×ê. Åæ ÇÓÊÙåÇä Íâèä ÇäãäåÇÊ ÇäåÑèÑêÉ ÇäåÔáÑÉ
çè ÃåÑ êïÔîÌñîÙï Ùäêç èÈÔÏÉ.
<example>
<title>
ÅÓÊÎÑÇÌ ÇäåèÇÏ ... èÈÙÖ ÇäãäåÇÊ ÇäåÑèÑêñÉ (Ãîêñ ÎÇÏå ÇäâÇÙÏÉ ÇäÈêÇæêñÉ)
</title>
<programlisting role="php"><![CDATA[
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
]]></programlisting>
</example>
ÇäÌÒÁ ÇäËÇÈÊ åæ ÇäÅÓÊáçÇå êåãæ åÒÌç
ÈÈäÇÚ <literal>SELECT</literal> ÂÎÑ ååÇ êïáÕðÍ Ùæ ã ÇäãäåÇÊ ÇäåÑèÑêñÉ:
<informalexample>
<programlisting><![CDATA[
'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--
]]></programlisting>
</informalexample>
ÅÐÇ Êå ÊÙêêæ çÐÇ ÇäÅÓÊáçÇå (ÇäÊäÇÙÈ Èà <literal>'</literal> è
<literal>--</literal>) äÅÍÏé ÇäåÊÚêñÑÇÊ ÇäåïÓòÊîÙòåîäîÉ áê
<varname>$query</varname>¬ áÅæ åÖÇÑ ÇäÅÓÊáçÇå ÊÖÙá.
</para>
<para>
ÊÍÏêËÇÊ SQL çê ÃêÖÇ åïÙîÑñÖÉ ÙæÏ ÇäçÌèå Ùäé âÇÙÏÊã ÇäÈêÇæêÉ. çÐç ÇäÅÓÊáçÇåÇÊ çê
ÃêÖÇ åïçÏÏñÉ åæ ÎäÇä ÇâÊ×ÇÙ èÅäÍÇâ ÇÓÊáçÇå ÌÏêÏ ÈÃãåäç ÅäêçÇ. äãæ
ÈÅåãÇæ ÇäåçÇÌå ÇäÊäÇÙÈ ÈÈæÏ <literal>SET</literal>. áê çÐç
ÇäÍÇäɬ êÌÈ ÇåÊäÇã ÈÙÖ ÇäåÙäèåÇÊ ÇäÊÎ×ê×êñÉ ÈÚÑÖ ÇäÊÙÇåä åÙ ÇäÅÓÊáçÇå ÈÔãä æÇÌÍ.
êåãæ ÇäÍÕèä Ùäé çÐÇ åæ ÎäÇä ÊáÍÕ ÃÓåÇÁ åÊÚêÑÇÊ ÇäæåèÐÌ Ãè
ÈÈÓÇ×É åæ ÎäÇä ÇäÅäÒÇå ÇäâÓÑê. äêÓÊ çæÇã ÇäÙÏêÏ åæ ÅÕ×äÇÍÇÊ ÊÓåêÉ
ÇäÍâèä ÇäÎÇÕÉ ÈÊÎÒêæ ÇäãäåÇÊ ÇäåÑèÑêñÉ Ãè ÃÓåÇÁ ÇäåÓÊÎÏåêæ.
<example>
<title>
åæ ÅÙÇÏÉ ÊÙêêæ ãäåÉ åÑèÑêñÉ ... Åäé ÇÓÊÍÕÇä åÒêÏ åæ ÇäÅåÊêÇÒÇÊ (Ãê ÎÇÏå äâÇÙÏÉ ÈêÇæêñÉ)
</title>
<programlisting role="php"><![CDATA[
$query = "UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
]]></programlisting>
</example>
äãæ åÓÊÎÏåÇ ÂËåÇ ÓêåÑÑ ÇäâêåÉ
<literal>' or uid like'%admin%'; --</literal> Åäé <varname>$uid</varname> ÈÚÑÖ
ÊÚêêÑ ãäåÉ åÑèÑ ÇäåÏêÑ Ãè ÈÈÓÇ×É ÊÍÏêÏ <varname>$pwd</varname> Èà
<literal>"hehehe', admin='yes', trusted=100 "</literal> (ÈáÑÇÚ
Îäáêñ) åæ ÃÌä ÇÓÊÍÕÇä åÒêÏ åæ ÇäÅåÊêÇÒÇÊ. ÍêæçÇ ÓêÊå ÊÍÑêá ÇäÅÓÊáçÇå:
<informalexample>
<programlisting role="php"><![CDATA[
// $uid == ' or uid like'%admin%'; --
$query = "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";
// $pwd == "hehehe', admin='yes', trusted=100 "
$query = "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE ...;"
]]></programlisting>
</informalexample>
</para>
<para>
åËÇä åÎêá Ùæ ãêáêÉ èäèÌ ÃèÇåÑ åÓÊèé æØÇå ÇäÊÔÚêä
Ùäé ÈÙÖ åÖêáê ÇäâèÇÙÏ ÇäÈêÇæêÉ.
<example>
<title>ÇäçÌèå Ùäé æØÇå ÇäÊÔÚêä ÇäÎÇÕ ÈåÖêá ÇäâÇÙÏÉ ÇäÈêÇæêÉ (ÎÇÏå MSSQL)</title>
<programlisting role="php"><![CDATA[
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
]]></programlisting>
</example>
ÅÐÇ âÇå ÇäåçÇÌå ÈÊåÑêÑ ÇäâêåÉ
<literal>a%' exec master..xp_cmdshell 'net user test testpass /ADD' --</literal>
Åäé <varname>$prod</varname>¬ ÍêæçÇ ÓÊÕÈÍ <varname>$query</varname>:
<informalexample>
<programlisting role="php"><![CDATA[
$query = "SELECT * FROM products
WHERE id LIKE '%a%'
exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
]]></programlisting>
</informalexample>
êæáÐ ÎÇÏå MSSQL ÈäÇÚÇÊ SQL ÈÇäÏïáÙÉ ÈåÇ áê Ðäã ÃåÑÇ
äÅÖÇáÉ åÓÊÎÏå ÌÏêÏ Åäé ÇäâÇÙÏÉ ÇäÈêÇæêñÉ ÇäÎÇÕÉ ÈÇäÍðÓÇÈÇÊ ÇäåÍäêñÉ. ÅÐÇ ãÇæ çÐÇ ÇäÊ×Èêâ
êÙåä Ùäé Ãæñç <literal>sa</literal> èÎÏåÉ MSSQLSERVER
ÊÙåä ÈÅåÊêÇÒÇÊ ãÇáêñɬ áÓêÕÈÍ ÈÍêÇÒÉ ÇäåçÇÌå ÇäÂæ
ÍÓÇÈÇ êäÌ Èç çÐÇ ÇäÌçÇÒ.
</para>
<note>
<para>
ÈÙÖÇ åæ ÇäÃåËäÉ áê ÇäÃÙäé ÊÊÙäâ ÈÎÇÏå åÙêñæ ääâèÇÙÏ ÇäÈêÇæêñÉ. äÇ
êÙæê çÐÇ Ãæ çÌèåÇ ååÇËäÇ êÙÊÈÑ åÓÊÍêäÇ ÖÏ åæÊèÌÇÊ ÃÎÑé.
ÎÇÏåã ääâèÇÙÏ ÇäÈêÇæêñÉ êåãæ Ãæ êãèæ ÚêÑ ÍÕêæ Ùäé æÍè åÚÇêÑ.
</para>
</note>
<sect3 id="security.database.avoiding">
<title>ÊâæêÇÊ ÇäÊäÇáê</title>
<simpara>
êåãæã ÇäÅÏÙÇÁ ÃèäÇ Ãæ ÇäåçÇÌå äÇ ÈÏ èÃæç ãÇæ êåÊäã åÙäèåÉ åÇ
ÈÎÕèÕ ÊÎ×ê× ÇäâÇÙÏÉ ÇäÈêÇæêñÉ áê åÙØå ÇäÃåËäÉ. ÃæÊ Ùäé Í⬠äãæ
ÊÙäå ÃÈÏÇ åÊé èãêá êåãæ ääÃåÑ Ãæ êÎÑÌ Ùæ ÇäâÇÙÏɬ èÅÐÇ ÍÏË Ðäã¬
Åæ âÇÙÏÊã ÇäÈêÇæêñÉ êåãæ Ãæ Êãèæ åïÙÑñÖÉ. ÅÐÇ ãæÊ ÈÕÏÏ ÇÓÊÙåÇä åÕÏÑ åáÊèÍ Ãè
ÍÒåÉ ÊÊÙÇåä åÙ ÇäâèÇÙÏ ÇäÈêÇæêñÉ åÊèáÑÉ ääÙåèå ÑÈåÇ ÊæÊåê Åäé
ÅÍÏé ÃæØåÉ ÊÓêêÑ ÇäåÖåèæ Ãè ÇäåæÊÏêÇʬ áÅæç ÈÅåãÇæ ÇäåÊÓääêæ èÈÓçèäÉ ÇäâêÇå
ÈæÓÎ äÌÒÁ åæ ÔêáÑÊã. êåãæ Ãæ êãèæ äÐäã ÊÈÙÇÊ ÃåæêÉ ÅÐÇ ãÇæ
Ç俨Çå åïÕåñåÇ ÈÔãä ÓêÁ.
</simpara>
<simpara>
çÐç ÇäçÌèåÇÊ Êâèå ÃÓÇÓÇ Ùäé ÇÓÊÚäÇä ÇäÔêáÑÉ ÇäÊê äå ÊãÊÈ
åÙ ÃÎÐ åÓÃäÉ ÇäÃåæ ÈÙêæ ÇäÅÙÊÈÇÑ. äÇ ÊËâ ÃÈÏÇ ÈÃê æèÙ åæ ÇäåïÏÎäÇʬ ÎÇÕÉ Êäã
ÇäÊê ÊÃÊê åæ æÇÍêÉ ÇäÒÈèæ ÍÊé èÅæ ãÇæ åÕÏÑçÇ åÑÈÙ ÅæÊâÇÁ¬
Íâä åïÏÎîä åÎáê Ãè åäá ÊÑÈê×. êØçÑ ÇäåËÇä ÇäÃèä Ãæ åËä çÐÇ
ÇäÅÓÊáçÇå ÚêÑ ÇäÖÇÑ êåãæ Ãæ êÊÓÈÈ áê ãèÇÑË.
</simpara>
<itemizedlist>
<listitem>
<simpara>
äÇ ÊÊÕä ÃÈÏÇ ÈÇäâÇÙÏÉ ÇäÈêÇæêñÉ ÈçèêÉ åÓÊÎÏå ÃÙØå Ãè åÇäã ÇäâÇÙÏÉ ÇäÈêÇæêñÉ.
ÅÓÊÙåä çèêÇÊ åïÔîÎÕæÉ äåÓÊÎÏåêæ Ðèê ÇåÊêÇÒÇÊ ÌÏ åÍÏèÏÉ.
</simpara>
</listitem>
<listitem>
<simpara>
ÊáâñÏ ÅÐÇ ãÇæ ÇäåïÏÎîä ÇäåïÙò×îé êÊèáÑ Ùäé æèÙ ÇäÈêÇæÇÊ ÇäåÊèâÙ. ÊÊèáÑ PHP
Ùäé ÊÔãêäÉ èÇÓÙÉ åæ ÏèÇä ÊÕÏêâ ÇäåïÏÎîäÇʬ ÅÈÊÏÇÁë åæ ÃÓçäçÇ
ÇäåèÌèÏÉ áê <link linkend="ref.variables">ÏèÇä ÇäåÊÚêÑÇÊ</link>
èáê <link linkend="ref.ctype">ÏèÇä ÃæèÇÙ ÇäÍÑèá</link>
(åËä <function>is_numeric</function>¬ <function>ctype_digit</function>¬
Ùäé ÇäÊèÇäê) Åäé ÚÇêÉ
ÏÙå <link linkend="ref.pcre">ÇäÙÈÇÑÇÊ ÇäÅÙÊêÇÏêñÉ ÇäåÊèÇáâÉ åÙ Perl</link>.
</simpara>
</listitem>
<listitem>
<para>
ÅÐÇ ãÇæ ÇäÊ×Èêâ ÈÕÏÏ ÇæÊØÇÑ ÇäåïïÏÎäÇÊ ÇäÙÏÏêñɬ áÙäêã ÇäÃÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ åÓÃäÉ ÇäÊÍââ åæ ÇäÈêÇæÇÊ
ÈèÇÓ×É <function>is_numeric</function> Ãè ÇäÊÚêêÑ ÈÕåÊ äæèÙçÇ
ÈÇÓÊÎÏÇå <function>settype</function> Ãè ÇÓÊÙåÇä ÊåËêäçÇ ÇäÙÏÏêñ
åæ ÎäÇä <function>sprintf</function>.
<example>
<title>×ÑêâÉ ÃãËÑ ÃåæÇ äÊÔãêä ÇÓÊáçÇå ÊÕáêÍêñ</title>
<programlisting role="php"><![CDATA[
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// ÑÌÇÁë¬ ÅæÊÈç Åäé %d áê ÇäÓäÓäÉ ÇäæñÕêñÉ áê ÇäÊæÓê⬠ÈÇÓÊÎÏÇå %s Óêãèæ ÈäÇ åÙæé
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
$offset);
]]></programlisting>
</example>
</para>
</listitem>
<listitem>
<simpara>
ÖÙ Èêæ ÙäÇåÊê ÊæÕêÕ ãä åïÏÎäÇÊ ÇäåÓÊÎÏå ÚêÑ ÇäÙÏÏêñÉ ÇäÊê êÊå ÊåÑêÑçÇ Åäé ÇäâÇÙÏÉ ÇäÈêÇæêñÉ ÈèÇÓ×É
<function>addslashes</function> Ãè <function>addcslashes</function>.
Å×äÙ Ùäé <link linkend="security.database.storage">ÇäåËÇä ÇäÃèä</link>.
åËäåÇ ÊØçÑç ÇäÃåËäɬ áÅæ ÙäÇåÇÊ ÇäÊæÕêÕ ÇäåÊÖåæÉ Öåæ ÇäÌÒÁ ÇäÑÇãÏ åæ ÇäÅÓÊáçÇå
ÚêÑ ãÇáêÉ èêåãæ âÑÕæÊçÇ ÈÓçèäÉ.
</simpara>
</listitem>
<listitem>
<simpara>
ÙÏå ×ÈÇÙÉ ÃêÉ åÙäèåÇÊ ÎÇÕÉ ÈÇäâÇÙÏÉ ÇäÈêÇæêñÉ èÎÇÕÉ
Êäã ÇäåÊÙäâÉ ÈÇäÊÎ×ê׬ ÓèÇÁ ÈÇä×Ñâ ÇäÌêÏÉ Ãè ÇäÔÇÆæÉ. Å×äÙ ÃêÖÇ Ùäé <link linkend="security.errors">ÇäÅÙäÇå Ùæ ÇäÃÎ×ÇÁ</link> è <link linkend="ref.errorfunc">ÏèÇä ÇäÊÙÇåä åÙ ÇäÃÎ×ÇÁ èÊÓÌêä ÇäÏÎèä</link>.
</simpara>
</listitem>
<listitem>
<simpara>
êåãæã ÇÓÊÙåÇä ÅÌÑÇÆêÇÊ åïÎÒñîæÉ èÑÄèÓ ÇäåÄÔÑÇÊ ÇäåÓÈèâÉ ÇäÔÑÍ åæ ÃÌä ÇÎÊÕÇÑ
èäèÌ ÇäÈêÇæÇÊ ÍÊé äÇ êÊåãæ ÇäåÓÊÎÏåèæ åæ ÇäèäèÌ åÈÇÔÑÉ Åäé ÇäÌÏÇèä èÇäåÔÇçÏ äãæ
äçÐÇ ÇäÍä ÊÃËêÑÇÊ ÃÎÑé.
</simpara>
</listitem>
</itemizedlist>
<simpara>
ÙäÇèÉ Ùäé çÐǬ áÅæã ÊÓÊáêÏ åæ ÇÓÊáçÇåÇÊ ÊÓÌêä ÇäÏÎèä ÓèÇÁ Öåæ ÇäÓãÑêÈÊ ÇäÎÇÕ Èã
Ãè åæ ÎäÇä ÇäâÇÙÏÉ ÇäÈêÇæêñÉ æáÓçǬ ÅÐÇ ãÇæÊ ÊÏÙåçÇ. ÈÇäÊÃãêϬ êÊå ÊÙ×êä ÊÓÌä ÇäÏÎèä
ÈÚÑÖ ÇäèâÇêÉ åæ ÃêÉ åÍÇèäÉ ÖÇÑÉ äãæ êåãæ Êãèæ åæ ÇäÅáÇÏÉ ÈåãÇæ ÇäÊÙÑá èÐäã åæ ÎäÇä ÇäÊÙâÈ ÇäÑÌÙêñ Ùäé Ãê
Ê×Èêâ Êå ÅÍÈÇ×ç. ÇäÏêèÇæ äêÓ åáêÏÇ áê ÍÏ ÐÇÊç èäãæ ÇäÍÇä ãÐäã
åæ ÎäÇä ÇäåÙäèåÇÊ ÇäÊê ÊÊÖåæçÇ. åÒêÏ åæ ÇäÊáÇÕêä çè áê ÇäÙÇÏÉ ÃáÖä.
</simpara>
</sect3>
</sect2>
</sect1>
<sect1 id="security.errors">
<title>ÇäÅÙäÇå Ùæ ÇäÃÎ×ÇÁ</title>
<para>
åæ ÎäÇä Ãåæ PHP¬ êÊÌäé èÌçÇæ ääÅÙäÇå Ùæ ÇäÃÎ×ÇÁ: ÃÍÏçåÇ
æÇáÙ êïÙîÒñðÒï ÇäÃåæ èÇäÂÎÑ åÓêÁ äç.
</para>
<para>
Êæ×èê Î×É çÌèå åâêÇÓêñÉ Ùäé åÑÇâÈÉ æØÇå ÈÊÚÐêÊç
ÈÈêÇæÇÊ ÚêÑ åäÇÆåÉ èåæ Ëå ÊáâñÏ ÃæèÇÙ èÓêÇâÇÊ
ÇäÃÎ×ÇÁ ÇäåïÙÇÏÉ. êÓåÍ çÐÇ äâÑÕÇæ Ç俨Çå ÈÓÈÑ
ÇäåÙäèåÇÊ ÇäåÊÙäâÉ ÈÇäÎÇÏå¬ ÈÚÑÖ ÊÍÏêÏ åèÇ׿ ÇäÖÙá ÇäååãæÉ.
Ùäé ÓÈêä ÇäåËÇä¬ ÅÐÇ ÇÓÊÌåÙ åçÇÌå åÇ åÙäèåÇÊ ÈÎÕèÕ ÕáÍÉ
âÇÆåÉ Ùäé ÊåÑêÑ Ãèäê äæåèÐ̬ áÅæç êÓÊ×êÙ åÍÇèäÉ ÓÍâ
ÇäåÊÚêÑÇÊ Ãè ÊÚêêÑçÇ:
<example>
<title>åçÇÌåÉ åÊÚêÑÇÊ ÈèÇÓ×É ÕáÍÉ ÊÔÙÈêÉ åïÎÕñÕîÉ</title>
<programlisting role="php"><![CDATA[
<form method="POST" action="attacktarget?username=badfoo&password=badfoo">
<input type="hidden" name="username" value="badfoo">
<input type="hidden" name="password" value="badfoo">
</form>
]]></programlisting>
</example>
</para>
<para>
ÃÎ×ÇÁ PHP ÇäÊê ÊÊå ÅÙÇÏÊçÇ ÈÔãä ×ÈêÙê êåãæ Ãæ Êãèæ ÊÇåÉ ÇäÅáÇÏÉ
ÈÇäæÓÈÉ äå×èñðÑ êÍÇèä ÅÒÇäÉ Ùðää ÓãÑêÈʬ åÔêÑÇ Åäé åËä çÐç ÇäÃÔêÇÁ
ÇäÊê áÔäÊ ãÇäÏÇäÉ Ãè Çäåäᬠåäá PHP ÇäÐê áÔä
èÑâå ÇäÓ×Ñ ÇäÐê ×Ñà áêç ÇäáÔä. çÐç çê ãä
ÇäåÙäèåÇÊ ÇäÊê êåãæ ÇÓÊÚäÇäçÇ. äêÓ åæ ÇäÅÓÊËæÇÁ Ãæ êÓÊÙåä å×èÑ php
<function>show_source</function>¬
<function>highlight_string</function> Ãè
<function>highlight_file</function> ãÅÌÑÇÁ äÅÒÇäÉ ÇäÙää¬ äãæ Öåæ
åèâÙ Íê¬ êåãæ Ãæ êÄÏê çÐÇ Åäé ÙÑÖ ÇäåÊÚêÑÇÊ ÇäåÎáêñɬ ÇäÕêÚ ÇäÚêÑ åïÊáîâîÏÉ
èåÙäèåÇÊ Î×êÑÉ ÃÎÑé. ÊÊåËä ÇäÎ×èÑÉ ÎÇÕÉ áê ÊÔÚêä
ÔêáÑÉ äçÇ åÕÇÏÑ åÙÑèáÉ åïÑòáîâîÉ ÈåâÇÈÖ ÅÒÇäÉ Ùää åïÊîÖîåîæîÉ ÙæÏ ÇäÊñîÔêêÏ Ãè åæ ÎäÇä ÇÓÊÙåÇä
ÊâæêÇÊ ÅÒÇäÉ ÇäÙää ÇäåÃäèáÉ. ÅÐÇ ãÇæ ÇäåçÇÌå âÇÏÑÇ Ùäé ÊÍÏêÏ ÃêÉ
ÊâæêÉ ÙÇåÉ ÊÓÊÙåäçǬ áÅæç êåãæç åÍÇèäÉ ÅäÒÇå ÕáÍÉ åÇ âÓÑÇ
åæ ÎäÇä ÅÑÓÇä åÎÊäá ÇäÓäÇÓä ÇäæñÕêñÉ ÇäÎÇÕÉ ÈÅÒÇäÉ ÇäÙðää ÇäåÃäèáÉ:
<example>
<title>ÅÓÊÚäÇä åÊÚêÑÇÊ ÅÒÇäÉ ÇäÙðää ÇäåÃäèáÉ</title>
<programlisting role="php"><![CDATA[
<form method="POST" action="attacktarget?errors=Y&showerrors=1"&debug=1">
<input type="hidden" name="errors" value="Y">
<input type="hidden" name="showerrors" value="1">
<input type="hidden" name="debug" value="1">
</form>
]]></programlisting>
</example>
</para>
<para>
ÈÚÖ ÇäæØÑ Ùæ ×ÑêâÉ ÇäÊÙÇåä åÙ ÇäÃÎ×ÇÁ¬ áÅæ âÇÈäêÉ ÓÈÑ
æØÇå ÈÍËÇ Ùæ ÇäÃÎ×ÇÁ êÄÏê Åäé ÊÒèêÏ åçÇÌå ÈåÒêÏ åæ
ÇäåÙäèåÇÊ.
</para>
<para>
Ùäé ÓÈêä ÇäåËÇä¬ ÃãËÑ åØçÑ ÎÇÕ ÈÎ×à ÙÇå Èà PHP êÔêÑ Åäé Ãæ æØÇå åÇ
çè ÈÕÏÏ ÊÔÚêä PHP. ÅÐÇ ãÇæ ÇäåçÇÌå êÈÍË Ùæ ÕáÍÉ ÐÇÊ ÇåÊÏÇÏ .html
èÃÑÇÏ ÓÈÑ ÇäæçÇêÉ ÇäÎäáêñÉ (back-end) (ÈÍËÇ Ùæ æâÇ× ÖÙá åÙÑèáÉ áê
Ç俨Çå) ÈÊÚÐêÊç ÈÇäÈêÇæÇÊ ÇäÎÇ×ÆÉ ÇäÊê êåãæç ÊèáêÑçÇ ÈÚÑÖ
ÊÍÏêÏ Åæ ãÇæ æØÇå åÇ âÏ Êå ÊÔêêÏç Èà PHP.
</para>
<para>
êåãæ äÎ×à ÏÇäÉ Ãæ êÔêÑ ÅÐÇ ãÇæ Ç俨Çå ÈÕÏÏ ÊÔÚêä
åÍÑã âèÇÙÏ ÈêÇæêñÉ ÎÇÕ Ãè êÙ×ê åáÇÊêÍ Íä äåÓÇÆä åËä ãêá ÊåÊ ÈÑåÌÉ Ãè ÊÕåêå ÕáÍÉ ÔïÙêñÉ åÇ.
êÓåÍ çÐÇ ÈÊâÕê ÃÙåâ Öåæ
åæÇáÐ ÇäâÇÙÏÉ ÇäÈêÇæêñÉ ÇäåáÊèÍÉ Ãè ÈÇäÈÍË Ùæ Ùðää ÎÇÕÉ Ãè æâÇ× ÖÙá
áê ÕáÍÉ ÔïÙêñÉ. áÙäé ÓÈêä ÇäåËÇä¬ åæ ÎäÇä ÇäÊÚÐêÉ ÈÃÌÒÇÁ åÎÊäáÉ åæ ÇäÈêÇæÇÊ ÇäÒÇÆáɬ
êåãæ äåçÇÌå Ãæ êïÍÏñðÏ ÊÑÊêÈ ÇäÊÍââ åæ ÇäçèêÉ áê ÓãÑêÈÊ
(Åæ×äÇâÇ åæ ÃÎ×ÇÁ Ñâå ÇäÓ×Ñ) èãÐÇ ÓÈÑ ÇäÅÓÊËåÇÑÇÊ ÇäÊê
êåãæ ÅÓÊÚäÇäçÇ áê åèÇâÙ åÎÊäáÉ áê ÇäÓãÑêÈÊ.
</para>
<para>
Åæ Î×Ãë åÊÙäâÇ ÈÇ俨Çå ÇäåäáÇÊê Ãè Î×à ÙÇåÇ ÈàPHP êåãæ Ãæ êÔêÑ Åäé Ãê ÇäÊÑÇÎêÕ
êÊèáÑ ÙäêçÇ ÇäÎÇÏå ÇäÔñÙêñ èãÐÇ ÈæêÉ èÊæØêå
ÇäåäáÇÊ Ùäé ÇäÎÇÏå ÇäÔñÙêñ. êåãæ äÔêáÑÉ Î×à åãÊèÈ åæ âÈä å×èñðÑ Ãæ ÊïÙîâñðÏ
ÇäåÔãäɬ åÄÏêÉ ÈÐäã Åäé ÇÓÊÚäÇä ÃÓçä ääåÙäèåÇÊ "ÇäÎáêñÉ"
ÇäåÐãèÑÉ ÓÇÈâÇ.
</para>
<para>
çæÇã ËäÇËÉ Íäèä ãÈÑé äçÐç ÇäåÓÃäÉ. ÊÊåËä ÇäÃèäé áê
ÊâÕê ãäñ ÇäÏñèÇä èåÍÇèäÉ ÇäÊÙèêÖ Ùæ åÙØå
ÇäÃÎ×ÇÁ. ÊÊåËä ÇäËÇæêÉ áê ÇäÊÙ×êä ÇäãÇåä ääÅÙäÇå Ùæ ÇäÃÎ×ÇÁ
Ùäé ÇäÔêáÑÉ ÇäÊê ÈÕÏÏ ÇäÅÔÊÚÇä. èÊÊåËä ÇäËÇäËÉ áê ÇÓÊÙåÇä ÏèÇä ÇäÊÙÇåä åÙ ÇäÃÎ×ÇÁ ÇäåÎÕÕÉ ÇäÎÇÕÉ È PHP
åæ ÃÌä ÅæÔÇÁ åâÈÖ ÇäÎ×à ÇäÎÇÕ Èã. ÈÍÓÈ
ÓêÇÓÊã ÇäÃåæêñɬ êåãæ Ãæ ÊÌÏ Ãæñ ãä ÇäÍäèä ÇäËäÇËÉ âÇÈäÉ ääÊ×Èêâ
ÈÇäæÓÈÉ äèÖÙêÊã.
</para>
<para>
çæÇã ×ÑêâÉ ääÅÍÇ×É ÈÇäåÓÃäÉ åïÓÈâÇ èÊÊåËä áê ÇÓÊÙåÇä
<function>error_reporting</function> ÇäÎÇÕÉ Èà PHP èÐäã ÈÚÑÖ äåÓÇÙÏÊã
äÊÃåêæ ÔêáÑÊã èÇäÈÍË Ùæ ÇÓÊÎÏÇå ÇäåÊÚêÑÇÊ ÇäÐê êåãæ Ãæ êãèæ Î×êÑÇ.
åæ ÎäÇä ÇÎÊÈÇÑ ÔêáÑÊ㬠âÈä ÇäæÔѬ èÐäã ÙÈÑ E_ALL¬ êåãæã
ÇäÅêÌÇÏ ÇäÓÑêÙ ääÈâÙ ÍêË êåãæ äåÊÚêÑÇÊã Ãæ ÊïáÊÍ ÈÚÑÖ ÇäÅêÐÇÁ
Ãè ÇäÊÙÏêä È×Ñâ ÃÎÑé. ÈåÌÑÏ åÇ ÊÕÈÍ ÌÇçÒÇ ääæÔѬ
èåæ ÎäÇä ÇÓÊÙåÇä E_NONE¬ áÅæã Êâê ÔêáÑÊã åæ ÇäÓÈÑ.
<example>
<title>ÅêÌÇÏ åÊÚêÑÇÊ Î×êÑÉ ÈèÇÓ×É E_ALL</title>
<programlisting role="php"><![CDATA[
<?php
if ($username) { // äå êÊå ÅÓÊçäÇäçÇ Ãè ÊáâÏçÇ âÈä ÇäÅÓÊÙåÇä
$good_login = 1;
}
if ($good_login == 1) { // ÅÐÇ áÔä ÇäÅÎÊÈÇÑ ÇäÙäèêñ¬ äå êÊå ÇÓÊçäÇäç Ãè ÊáâÏç âÈä ÇäÅÓÊÙåÇä
readfile ("/bayanat/jidu/hassassa/index.html");
}
?>
]]></programlisting>
</example>
</para>
</sect1>
<sect1 id="security.registerglobals">
<title>ÅÓÊÙåÇä ÔÇåäÇÊ ÇäÊÓÌêä (Register Globals)</title>
<para>
äÑÈåǬ ÇäÊÚêêÑ ÇäÃãËÑ ÅËÇÑÉ ääÌÏä áê PHP çè ÙæÏåÇ ÅæÊâäÊ ÇäâêåÉ ÇäÅáÊÑÇÖêñÉ
ÇäÎÇÕÉ ÈÊèÌêç PHP<link linkend="ini.register-globals">
register_globals</link> åæ ON Åäé OFF áê PHP
<ulink url="&url.php.release4.2.0;">4.2.0</ulink>. ÇäËâÉ ÈçÐÇ
ÇäÊèÌêç ãÇæÊ ÔÈç åÔÊÑãÉ èÇäãËêÑ åæ ÇäæÇÓ äå êãèæèÇ êÙÑáèæ ÍÊé ÃæçÇ åèÌèÏÉ
èãÇæèÇ êáÊÑÖèæ Ãæ çÐç çê ãÐäã ×ÑêâÉ ÙåäÉ PHP. çÐç ÇäÕáÍÉ ÓÊÔÑÍ ãêá êåãæ äÔÎÕ åÇ
ãÊÇÈÉ ÔêáÑÉ ÚêÑ ÂåæÉ åÑáèâÉ ÈçÐÇ ÇäÊèÌêç äãæ ÊÐãÑ Ãæ
ÚæÙÏÇå ÇäÃåæ äêÓ áê ÇäÊèÌêç áê ÍÏ ÐÇÊç èÅæñåÇ áê ÓèÁ ÇÓÊÙåÇäç.
</para>
<para>
ÙæÏåÇ Êãèæ ÇäâêåÉ On¬ áÅæ register_globals ÓÊâèå ÈÍâæ (ÊÓåêå) ÓãÑêÈÊÇÊã ÈãÇáÉ
ÃæèÇÙ ÇäåÊÚêÑÇʬ åËä ×äÈ ÇäåÊÚêÑÇÊ åæ æåÇÐÌ html. âÑæ çÐÇ
ÈèÇâÙ Ãæ PHP äÇ êÔÊÑ× ÅÓÊçäÇä ÇäåÊÚêÑÇÊ
êÙæê Ãæ ãÊÇÈÉ ÔêáÑÉ ÚêÑ ÂåæÉ çê ÃåÑ ÃÓçä ÈãËêÑ. äâÏ ãÇæ âÑÇÑÇ
ÕÙÈǬ äãæ åÌåèÙÉ PHP âÑÑÊ ÊÙ×êä çÐÇ ÇäÊèÌêç ÈÔãä
ÅáÊÑÇÖê. ÙæÏåÇ Êãèæ ÇäâêåÉ On¬ áÅæ ÇäÃÔÎÇÕ êÓÊÙåäèæ åÊÚêÑÇÊ èçå äÇ êÙÑáèæ Íâ Çäêâêæ ÍÊé
åÕÏÑçÇ èÈåâÏèÑçå ÇäÒÙå áâ×. ÇäåÊÚêÑÇÊ ÇäÏÇÎäêñÉ
ÇäåïÙÑñîáÉ áê ÇäÓãÑêÈÊ æáÓç êÊå ÏåÌçÇ ÈÇäÈêÇæÇÊ Çä×äÈêÉ ÇäåïÑÓîäîÉ åæ âÈä
ÇäåÓÊÎÏåêæ èÊÙ×êä register_globals êÚêñÑ çÐÇ ÇäèÖÙ. äæÓÊÏä
ÈåËÇä Ùæ ÓèÇÁ ÇÓÊÙåÇä register_globals:
</para>
<para>
<example>
<title>åËÇä Ùæ ÓèÁ ÇÓÊÙåÇä register_globals = on</title>
<programlisting role="php"><![CDATA[
<?php
// ÊÙÑêá $authorized = true áâ× ÅÐÇ ãÇæ ÇäåÓÊÎÏå âÏ Êå ÊÓÌêä ÏÎèäç
if (authenticated_user()) {
$authorized = true;
}
// ÈÓÈÈ ÃææÇ äå æâå áê ÇäÃèä ÈÇÓÊçäÇä $authorized Ùäé Ãæç false¬ áêåãæ
// ÊÙÑêáç åæ ÎäÇä register_globals¬ åËäÇ Åæ×äÇâÇ åæ GET auth.php?authorized=1
// äÐä㬠êåãæ åÔÇçÏÉ Ãê ÃÍÏ Ùäé Ãæ ÏÎèäç åïÓÌñîä!
if ($authorized) {
include "/jidan/hassassa/bayanat.php";
}
?>
]]></programlisting>
</example>
</para>
<para>
ÙæÏåÇ Êãèæ register_globals = on¬ áÅæ åæ×âæÇ ÇäÙäèêñ êåãæ Ãæ êãèæ åïÙÑñîÖÇ ääÎ×Ñ. èÙæÏåÇ Êãèæ ÇäâêåÉ
off¬ áÅæ <varname>$authorized</varname> äÇ êåãæ ÊÍÏêÏçÇ åæ ÎäÇä ×äÈêÉ èÈÐäã êãèæ ÇäÃåÑ
ÌêÏǬ ÑÚå Ãæ ÇÓÊçäÇä ÇäåÊÚêÑÇÊ ÃèäÇ çè áê ÇäÙåèå èáÙäÇ ååÇÑÓÉ ÈÑåÌêñÉ ÌêÏÉ.
Ùäé ÓÈêä ÇäåËÇä¬ áê åËÇäæÇ ÇäÙäèêñ¬ ãÇæ ÈÅåãÇææÇ
ÇäâêÇå ÃèäÇ ÈÌÙä âêåÉ <literal>$authorized = false</literal>. âêÇåæÇ ÈçÐÇ
ÃèäÇ êÙæê Ãæ ÔêáÑ澂 ÇäÙäèêñÉ ãÇæÊ ÓÊÙåä åÙ register_globals ÓèÇÁ ÃãÇæÊ On Ãè Off ÈÇÙÊÈÇÑ
Ãæ ÇäåÓÊÎÏåêæ Óêãèæèæ ÚêÑ åïÎîèîäðêæ ÈÔãä ÅáÊÑÇÖêñ.
</para>
<para>
åËÇä ÂÎÑ êÊåËä áê <link linkend="ref.session">ÇäÌäÓÇÊ</link>.
ÙæÏåÇ Êãèæ register_globals = on¬ êåãææÇ ÇêÖÇ ÇÓÊÙåÇä
<varname>$username</varname> áê åËÇäæÇ ÇäÓáäêñ äãæ åæ ÌÏêÏ êÌÈ Ùäêã
ÊÕèÑ Ãæ <varname>$username</varname> êåãæ Ãæ ÊÃÊê ÃêÖÇ åæ ÎäÇä èÓÇÆä ÃÎÑé¬
åËä GET (ÙÈÑ åÍÏÏ ÇäåèÑÏ ÇäåÊÔÇãä).
</para>
<para>
<example>
<title>åËÇä Ùæ ÇÓÊÙåÇä ÇäÌäÓÇÊ ÈÇäÊÒÇåæ åÙ register_globals ÓèÇÁ ÃãÇæÊ On Ãè Off</title>
<programlisting role="php"><![CDATA[
<?php
// ä æÙÑá åÕÏÑ âÏèå $username èäãæ çä ÊÙÑá $_SESSION
// äÈêÇæÇÊ ÇäÌäÓÉ
if (isset($_SESSION['username'])) {
echo "ÃçäÇ <b>{$_SESSION['username']}</b>";
} else {
echo "ÃçäÇ <b>êÇ Öêá</b><br />";
echo "çäÇ âåÊ ÈÊÓÌêä ÏÎèäã?";
}
?>
]]></programlisting>
</example>
</para>
<para>
ÅÐÇ åÇ ãÇæÊ çæÇã åÍÇèäÉ ääÊäáê⬠áÅæç åæ Çäååãæ ÍÊé ÅÊÎÇÐ ÅÌÑÇÁÇÊ èâÇÆêñÉ ääÊÍÐêÑ.
ÅÐÇ ãæÊ ÊÙäå åÙØå ÇäèâÊ èÊÍÏêÏÇ åÕÏÑ âÏèå åÊÚêÑ åǬ
áêåãæã ÇäÊåÙæ ÅÐÇ ãÇæÊ ÇäÈêÇæÇÊ ÇäåïåîÑñîÑñîÉ åÕÏÑçÇ
æèÙ ÚêÑ äÇÆâ åæ ÇäÊåÑêÑÇÊ. áê Íêæ Ãæç äÇ êåãæ
ÖåÇæ Ãæñ ÇäÈêÇæÇÊ âÏ Êå ÊäáêâçÇ ÅäÇ Ãæ ÇäÃåÑ âÏ êâÊÖê åæ ÇäåçÇÌå
ÇäÊáãêÑ áê Çä×ÑêâÉ ÇäÕÍêÍÉ ääÊäáêâ. ÅÐÇ äå Êãæ ÊçÊå äåÕÏÑ ÇäÈêÇæÇÊ Çä×äÈêñɬ
áêåãæã ÇÓÊÙåÇä <varname>$_REQUEST</varname> ÈÇÙÊÈÇÑ ÃæçÇ ÇÍÊèê
åÒêÌÇ åæ ÈêÇæÇÊ GET¬ POST è COOKIE. Å×äÙ¬ áê ÇäÏäêä¬ Ùäé ÇäáÕä ÇäåÊÙäâ
ÈÇÓÊÎÏÇå <link linkend="language.variables.external">ÇäåÊÚêÑÇÊ åæ ÎÇÑÌ
PHP</link>.
</para>
<para>
<example>
<title>ÇäãÔá Ùæ ÊÓåêå ÈÓê× ääåÊÚêÑÇÊ</title>
<programlisting role="php"><![CDATA[
<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE åÕÏÑçÇ åäá ÊÑÈê×.
// ÊÃãêÏ åæ ÇÓÊêËÇâ ÈêÇæÇÊ åäá ÇäÊÑÈê×!
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("[email protected]", "åÍÇèäÉ ÅÙÇâÉ åÍÊåäÉ", $_SERVER['REMOTE_ADDR']);
echo "ÅæÊçÇã ääÃ忬 äâÏ Êå ÊæÈêç ÇäåÏêÑ.";
exit;
} else {
// MAGIC_COOKIE äå êÊå ÊÍÏêÏçÇ ÙÈÑ REQUEST
}
?>
]]></programlisting>
</example>
</para>
<para>
ÈÇä×ÈÙ¬ äÇ êÙæê åÌÑÏ ÊÙ×êä register_globals Ãæ ÔêáÑÊã
ÂåæÉ. êÌÈ ÃêÖÇ ÇäÊÏâêâ áê ãä â×ÙÉ ÈêÇæÇÊ êÊå ÊåÑêÑçÇ èÐäã È×Ñâ ÃÎÑé.
âå ÏÇÆåÇ ÈÇÓÊêËÇâ ÈêÇæÇÊ ÇäåÓÊÎÏåêæ èÈÇÓÊçäÇä
åÊÚêÑÇÊã! åæ ÃÌä ÊáâÏ ÇäåÊÚêÑÇÊ ÇäÊê äå êÊå ÇÓÊçäÇäçÇ ÈÇäÙèÏÉ Åäé
<function>error_reporting</function> ÈÚÑÖ ÅØçÇÑ
ÃÎ×ÇÁ åÓÊèé <constant>E_NOTICE</constant>.
</para>
¬e.superglobals;
</sect1>
<sect1 id="security.variables">
<title>ÇäÈêÇæÇÊ ÇäåïåîÑñîÑñîÉ åæ âÈä ÇäåÓÊÎÏåêæ</title>
<para>
Åæ ÃÙØå æâÇ× ÇäÖÙá áê ÇäÙÏêÏ åæ ÈÑÇåÌ PHP äÇ ÊäÇÒå ÇääÚÉ
áê ÍÏñð ÐÇÊçÇ» ÇäåÓÃäÉ çê äåÌÑÏ Ãæ ÇäÔêáÑÉ äå ÊãÊÈ åÑáèâÉ ÐçæêëÇ
ÈåÔÇÚä ÇäÃåæ. äçÐÇ ÇäÓÈȬ Ùäêã ÏèåÇ ÃÎÐ ÇäèâÊ ÇääÇÒå
ääÃÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ ÇäÊÑñÊÈÇÊ ÇäåïÊîèñîäñðÏîÉ Ùæ ÌÒÁ åïÙò×îé åæ ÇäÔêáÑÉ ääÊîËñîÈñïÊ åæ
ÇäÖñîÑÑ ÇäåÍÊåä ÅÐÇ åÇ Êå ÊåÑêÑ åÊÚêÑ ÚêÑ åÊèâÙ ÅäêçÇ.
<example>
<title>ÇäÅÓÊÙåÇä ÇäÎ×Ñ ääåÊÚêÑÇÊ</title>
<programlisting role="php"><![CDATA[
<?php
// æÒÙ åäá åæ ÇäåÌäÏ Çäåè׿ ääåÓÊÎÏêæ... Ãè ÑÈåÇ
// ÇäÎÇÕ ÈÔÎÕ ÂÎÑ¿
unlink ($evil_var);
// ãÊÇÈÉ ÊÓÌêä ÇäÏÎèä ÇäÎÇÕ ÈèäèÌçå... Ãè ÑÈåÇ åïÏòÎîä /etc/passwd ¿
fputs ($fp, $evil_var);
// ÊæáêÐ ÔêÁ ÊÇáç .. Ãè rm -rf *¿
system ($evil_var);
exec ($evil_var);
?>
]]></programlisting>
</example>
Ùäêã Ãæ Êâèå ÈÇäÊáÍÕ ÇäÏÇÆå äÔêáÑÊã ääÊÃãÏ åæ Ãæñ ÃêÉ
åÊÚêÑÇÊ êÊå ÊåÑêÑçÇ Åæ×äÇâÇ åæ åÓÊÙÑÖ ÔïÙêñ êÊå ÃêÖÇ
ÊáâÏçÇ ÈÔãä åäÇÆå èÃ×ÑÍ Ùäé æáÓã ÇäÃÓÆäÉ ÇäÊÇäêñÉ:
<itemizedlist>
<listitem>
<simpara>
çä ÓêÄËÑ çÐÇ ÇäÓãÑêÈÊ áâ× áê ÇäåäáÇÊ ÇäåâÕèÏÉ¿
</simpara>
</listitem>
<listitem>
<simpara>
çä êåãæ ÇäÙåä Ùäé ÇäÈêÇæÇÊ ÚêÑ ÇäåÙÊÇÏÉ Ãè ÚêÑ ÇäåÑÚèÈ ÈçÇ¿
</simpara>
</listitem>
<listitem>
<simpara>
çä êåãæ ÇÓÊÙåÇä çÐÇ ÇäÓãÑêÈÊ È×Ñâ ÚêÑ åâÕèÏÉ¿
</simpara>
</listitem>
<listitem>
<simpara>
çä êåãæ ÇÓÊÙåÇä çÐÇ ÈÇäÊÒÇåæ åÙ ÓãÑêÈÊÇÊ ÃÎÑé È×ÑêâÉ
ÓäÈêñÉ¿
</simpara>
</listitem>
<listitem>
<simpara>
çä ÓêÊå ÊÏèêæ ÃêÉ åÙÇåäÇÊ È×ÑêâÉ åæÇÓÈÉ¿
</simpara>
</listitem>
</itemizedlist>
åæ ÎäÇä Çä×ÑÍ ÇäåæÇÓÈ äçÐç ÇäÃÓÆäÉ ÈÇäÊÒÇåæ åÙ ãÊÇÈÉ ÇäÓãÑêÈʬ
ÈÏäÇ åæ ×ÑÍçÇ áêåÇ ÈÙϬ ÓÊÊáÇÏé ÅÙÇÏÉ ãÊÇÈÉ ÊÙêÓÉ ÙæÏåÇ
ÊÍÊÇÌ äÊè×êÏ Ãåæã. ÈÇäÅÈÊÏÇÁ ÈçÐç ÇäÊñèÕêÇÊ ÇäÊáãêÑêñɬ
äæ ÊÖåæ Ãåæ æØÇåã äãæ êåãæã ÇäåÓÇÙÏÉ
Ùäé ÊÍÓêæç.
</para>
<para>
ÃêÖǬ êåãæ Ãæ ÊÑÚÈ áê ÇäÃÎÐ ÈÙêæ ÇäÅÙÊÈÇÑ åÓÃäÉ ÊÙ×êä register_globals¬
magic_quotes Ãè ÅÙÏÇÏÇÊ ÇäåïäÇÁîåÉ ÇäÊê êåãæ ÊÎä× Ùäêã ÇäÃåèÑ
ÈÎÕèÕ ÕäÇÍêɬ åÕÏÑ Ãè âêåÉ åÊÚêÑ åïÙò×îé.
Åæ ÇäÙåä Èà PHP áê èÖÙ error_reporting(E_ALL) êåãæ Ãæ êÓÇÙÏ Ùäé ÊæÈêçã
ÈÎÕèÕ ÇäåÊÚêÑÇÊ ÇäÌÇÑê ÇÓÊÙåÇäçÇ âÈä ÊáâÏçÇ Ãè
ÇÓÊçäÇäçÇ (èÈÐäã êåãæã ÊáÇÏê Ãæ êÊå ÇäÙåä Ùäé
ÇäÈêÇæÇÊ ÚêÑ ÇäåÙÊÇÏÉ).
</para>
</sect1>
<sect1 id="security.hiding">
<title>åèÇÑÇÉ PHP</title>
<para>
Ùäé ÇäÙåèå¬ áÅæ ÇäÃåæ ÇäåÊÓÊÑ çè ÃÍÏ ÃÖÙá ÃÔãÇä ÇäÃåæ.
äãæ áê ÈÙÖ ÇäÃÍêÇæ¬ ãä ÅÖÇáÉ ÃåæêñÉ çê åÑÚèÈÉ.
</para>
<para>
êåãæ äÈÖÙÉ ÊâæêÇÊ ÈÓê×É Ãæ ÊÓÇÙÏã Ùäé åèÇÑÇÉ PHP èÑÈåÇ Ùäé ÅÈ×ÇÁ
åçÇÌå êÍÇèä ÅãÊÔÇá æâÇ× ÇäÖÙá áê
æØÇåã. åæ ÎäÇä ÊÍÏêÏ âêåÉ expose_php = off áê åäá &php.ini; ÇäÎÇÕ Èã¬
êåãæã ÅæâÇÕ åâÏÇÑ ÇäåÙäèåÇÊ ÇäåÊèáÑÉ äÏêçÇ.
</para>
<para>
çæÇã Î×É ÃÎÑé ÊÊåËä áê ÊçêÆÉ ÇäÎèÇÏå ÇäÔñïÙêñÉ åËä Apache äÊáÓêÑ
åÎÊäá ÃæèÇÙ ÇäåäáÇÊ åæ ÎäÇä PHP¬ ÅåÇ ÈÊèÌêç &htaccess;
Ãè ÙÈÑ åäá ÊçêÆÉ Apache æáÓç. ÍêæçǬ êåãæã
ÇÓÊÙåÇä ÅåÊÏÇÏÇÊ ÇäåäáÇÊ ÇäÊñÖäêäêñÉ:
<example>
<title>åèÇÑÇÉ PHP Ùäé ÃæçÇ äÚÉ ÃÎÑé</title>
<programlisting role="apache-conf"><![CDATA[
# ÅÌÙä ÔêáÑÉ PHP ÊØçÑ åËä ÃæèÇÙ ÇäÔêáÑÉ ÇäÃÎÑé
AddType application/x-httpd-php .asp .py .pl
]]></programlisting>
</example>
Ãè ÇÓÊÑçÇ ÊåÇ:
<example>
<title>ÅÓÊÙåÇä ÃæèÇÙ ÚêÑ åÙÑèáÉ åæ ÅåÊÏÇÏÇÊ PHP</title>
<programlisting role="apache-conf"><![CDATA[
# ÅÌÙä ÔêáÑÉ PHP ÊØçÑ åËä ÇäÃæèÇÙ ÚêÑ ÇäåÙÑèáÉ
AddType application/x-httpd-php .bop .foo .133t
]]></programlisting>
</example>
Ãè åèÇÑÇÊçÇ Ùäé ÃæçÇ ÔêáÑÉ html ååÇ êÊÑÊÈ Ùæç ÊÃËêÑ ×áêá Ùäé ÇäáÙÇäêÉ äÃæñ
ãÇáÉ åäáÇÊ html ÓêÊå ÊáÓêÑçÇ åæ ÎäÇä åÍÑã PHP:
<example>
<title>ÅÓÊÙåÇä ÃæèÇÙ html ãÇåÊÏÇÏÇÊ äà PHP</title>
<programlisting role="apache-conf"><![CDATA[
# ÅÌÙä ãä ÔêáÑÉ PHP ÊØçÑ èãÃæçÇ html
AddType application/x-httpd-php .htm .html
]]></programlisting>
</example>
ÍÊé êÙåä çÐÇ áÙäêǬ êÌÈ Ùäêã ÅÙÇÏÉ ÊÓåêÉ åäáÇÊ PHP ÇäÎÇÕÉ Èã äÍåä
ÇäÅåÊÏÇÏÇÊ ÇäÙäèêñÉ. åÙ Ãæ çÐÇ çè Ôãä ääÃåæ ÇäåÊÓÊѬ
ÅäÇ Ãæç ÅÌÑÇÁ èâÇÆê ×áêá êæ×èê Ùäé Çäâäêä åæ ÇäåÓÇèÆ.
</para>
</sect1>
<sect1 id="security.current">
<title>ÇäÊÍÏêË ÇäåÓÊåÑ</title>
<simpara>
åËä Ãê æØÇå ãÈêÑ ÂÎѬ áÅæñ PHP çè âêÏ ÇäÊáÍÕ ÇäÏÇÆå èÇäÊÍÓêæ.
ãä ÅÕÏÇÑÉ ÌÏêÏÉ ÊÊÖåæ ÚÇäÈÇ ãäÇ åæ ÇäÊÚêêÑÇÊ ÇäãÈÑé èÇäÕÚÑé
ÈÚÑÖ ÊÙÒêÒ èÅÕäÇÍ ÇäæâÇÆÕ ÇäÃåæêñɬ ÊÔèñïçÇÊ ÇäÊñçêÆÉ
èåÓÇÆä ÃÎÑé ÊÄËÑ áê Ãåæ
èÇÓÊâÑÇÑ æØÇåã ÈÇäãÇåä.
</simpara>
<simpara>
åËä äÚÇÊ èÈÑÇåÌ ÇäÈÑåÌÉ ÇäÔñÙêÉ åæ åÓÊèé Ç俨Çå ÇäÃÎÑé¬ áÅæ ÃáÖä
åâÇÑÈÉ çê ÇäÊÍÏêË ÚÇäÈÇ èÅÈâÇÁ ÇäÅæÊÈÇç ÈÎÕèÕ ÂÎÑ
ÇäÅÕÏÇÑÇÊ èÇäÊÚêêÑÇÊ Çä×ÇÑÆÉ ÈçÇ.
</simpara>
</sect1>
</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
-->