1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
|
<?xml version="1.0" encoding="iso-8859-9"?>
<!-- $Revision: 1.2 $ -->
<chapter id="features.file-upload">
<title>Dosya ykleme ynetimi</title>
<sect1 id="features.file-upload.post-method">
<title>POST metodu ile dosya ykleme</title>
<simpara>
PHP, RFC-1867 uyumlu tm tarayıcılardan (Netscape Navigator 3 ve daha st srmler,
Mcrosoft'un yayınladığı bir yama ile Microsoft Internet Explorer 3, veya diğer st srmleri)
dosya yklemek iin yeteneklidir. Bu zellik kullanıcıların binary veya metinsel
dosya ykleyebilmelerini sağlamaktadır. PHP'nin yetkilendirme ve dosya işleme zellikleri ile,
dosyaları kimin ykleybileceği ve yklendikten sonra ne yapılacağı konusunda tam kontrol sahibisinizdir.
</simpara>
<para>
PHP, Netscape Composer ve W3C'nin Amaya yeleri tarafından kullanılan PUT yntemi ile de
dosya ykleme işlemini destekler. PUT Yntemi hakkında detaylı bilgi iin<link
linkend="features.file-upload.put-method">tıklayınız.</link>
</para>
<para>
Dosya ykleme ekranı, aşağıdaki gibi zel bir form hazırlamakla oluşturulur:
<example>
<title>Dosya Ykleme Formu</title>
<programlisting role="html">
<![CDATA[
<form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Bu dosyayı gnder: <input name="userfile" type="file">
<input type="submit" value="Gnder">
</form>
]]>
</programlisting>
</example>
_URL_ bir PHP dosyasını işaret etmelidir. MAX_FILE_SIZE gizli alanı, form iinde
dosya alanından stte olmalıdır ve taşığıdı değer, kabul edilebilir enfazla dosya boyunu
gsterir. Değer byte cinsindendir.
<warning>
<para>
MAX_FILE_SIZE sadece tarayıcıya, bu boyutu aşmamasını syler. Bunu aşmak ok kolaydır.
Bu yzden buna pek fazla gvenmeyin. PHP'nin ayarlarındaki maximum-size ise aşılamaz.
</para>
</warning>
</para>
<para>
PHP'de , <filename>php.ini</filename> iindeki <link
linkend="ini.register-globals">register_globals</link>'ın on olduğu varsayılırsa,
başarılı bir dosya ykleme anında aşağıdaki değişkenler tanımlanır.
Eğer <link
linkend="ini.track-vars">track_vars</link> on ise, bu değişkenler PHP'nin
<varname>$HTTP_POST_VARS</varname> dizinleri olarak da alınabilir.
Aşağıdaki değişken adları, yukarıdaki rnekteki 'userfile' alan adının kullanıldığı varsayılarak
verilmiştir:
<itemizedlist>
<listitem>
<simpara>
<varname>$userfile</varname> - Dosyanın, sunucuda saklanan geici adı.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_name</varname> - Dosyayı gnderen kişinin bilgisayarındaki dosyanın
orijinal adı veya sistem yolu.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_size</varname> - Gnderilen dosyanın byte cinsinden boyutu.
</simpara>
</listitem>
<listitem>
<simpara>
<varname>$userfile_type</varname> - Tarayıcının bu bilgiyi vermesine bağlı olarak,
dosyanın mime tipi. rneğin "image/gif".
</simpara>
</listitem>
</itemizedlist>
Yukarıdaki değişkenlerin "$userfile" blm, ykleme formundaki INPUT TYPE=file
alanına verdiğiniz isimdir. Yukarıdaki ykleme formunda biz "userfile" ismini kullandık.
</para>
<para>
PHP 4'de durum bir para farklı. Yklenen dosya bilgileri <varname>$HTTP_POST_FILES</varname>
dizinlerine yklenmiştir. Bu PHP 3'de olduğu gibi, eğer <link linkend="ini.track-vars">track_vars</link>
on olarak tanımlanmış ise geerlidir. Fakat PHP 4.0.2 ve st srmlerinde
<link linkend="ini.track-vars">track_vars</link> on olarak tanımlı gelir.
</para>
<para>
<varname>$HTTP_POST_FILES</varname>'ın ieriği aşağıdaki gibidir.
Bu rnekte de, formdaki dosya ykleme alanının adının "userfile" olduğu varsayılmıştır:
<variablelist>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term>
<listitem>
<para>
Dosyanın, dosyayı gnderenin bilgisayarındaki orijinal adı.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['type']</varname></term>
<listitem>
<para>
Tarayıcının bu bilgiyi vermesine bağlı olarak,
dosyanın mime tipi. rneğin <literal>"image/gif"</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['size']</varname></term>
<listitem>
<para>
Gnderilen dosyanın byte cinsinden boyutu.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>$HTTP_POST_FILES['userfile']['tmp_name']</varname></term>
<listitem>
<para>
Dosyanın, sunucuda saklanan geici adı.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
<filename>php.ini</filename> iindeki <link
linkend="ini.upload-tmp-dir">upload_tmp_dir</link> tanımlamasına farklı bir yer
tanımlanmadıka, dosyalar, sunucuda tanımlı olan geici klasr de saklanır.
Sunucunun tanımlı geici klasr, <envar>TMPDIR</envar> değişkeni tanımlanarak değiştirilebilir.
Bu tanımlamayı, PHP dosyası iinde <function>putenv</function> fonksiyonunu kullanarak
tanımlamak geerli olmayacaktır.
Bu değişkeni, gnderilen dosya zerindeki başka işlemlerin alışırlığından
emin olmak iinde kullanabilirsiniz.
<example>
<title>Dosya Ykleme Kontrol</title>
<para>
Aşağıdaki rnek, PHP 3'n, 3.0.16'den ve PHP 4'n 4.0.2'den yksek srmleri iindir.
Fonksiyon zellikleri iin <function>is_uploaded_file</function> ve
<function>move_uploaded_file</function> sayfalarına bakınız.
</para>
<programlisting role="php">
<![CDATA[
<?php
if (is_uploaded_file($userfile)) {
copy($userfile, "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack: filename '$userfile'.";
}
/* ...or... */
move_uploaded_file($userfile, "/place/to/put/uploaded/file");
?>
]]>
</programlisting>
<para>
PHP'nin daha nceki srmleri iin, aşağıdaki gibi bir seye ihtiyacınız var.
<note>
<para>
Bu rnek PHP'nin 4.0.2'den sonraki srmlerinde <emphasis>alışmaz</emphasis>.
</para>
</note>
</para>
<programlisting role="php">
<![CDATA[
<?php
/* Userland test for uploaded file. */
function is_uploaded_file($filename) {
if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
$tmp_file = dirname(tempnam('', ''));
}
$tmp_file .= '/' . basename($filename);
/* User might have trailing slash in php.ini... */
return (ereg_replace('/+', '/', $tmp_file) == $filename);
}
if (is_uploaded_file($userfile)) {
copy($userfile, "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack: filename '$userfile'.";
}
?>
]]>
</programlisting>
</example>
</para>
<simpara>
Gnderilen dosyayı alan PHP dosyanız, gnderilen dosyanın ne yapılacağına
karar vermek iin programlanmalıdır.
rneğin, dosya boyutu ok byk veya ok kk olan
dosyaları kabul etmemek iin <varname>$file_size</varname> değişkenini kullanabilirsiniz.
<varname>$file_type</varname> değişkenini, belirlediğiniz kriterlerdeki dosya tipine uymayan
dosyaları kabul etmemek iin kullanabilirsiniz.
İstemediğiniz bu dosyaları, geici klasrden silebilir veya farklı bir klasre taşıyabilirsiniz.
</simpara>
<simpara>
İşlem sonunda, dosya taşınmadı veya adı değiştirilmedi ise, geici
klasrden silinir.
</simpara>
</sect1>
<sect1 id="features.file-upload.common-pitfalls">
<title>Genel Tehlikeler</title>
<simpara>
Formdaki <literal>MAX_FILE_SIZE</literal> alanı, PHP'nin ini tanımlarındaki
<link linkend="ini.upload-max-filesize">upload_max_filesize</link> da tanımlanmış değerden
daha byk bir değer tanıyamaz. Tanımlı gelen 2 Megabyte tır.
</simpara>
<simpara>
İşlem yaptığınız dosyayı kontrol etmemek, kullanıcıların diğer klasrlerdeki
hassas bilgilerinize erişebilmesi demektir.
</simpara>
<simpara>
Ltfen CERN httpd'nin istemciden gelen content-type mime başlığında ilk boşluktan sonraki her şeyi silme eğiliminde olduğunu
not edin. Bu durum devam ettike, CERN httpd dosya ykleme zelliğini desteklemeyecektir.
</simpara>
</sect1>
<sect1 id="features.file-upload.multiple">
<title>oklu Dosya Ykleme</title>
<simpara>
Aynı anda birden fazla dosya yklemek ve dosya bilgilerini otomatik olarak
organize olmuş bir dizin olarak almak mmkndr. Bunu yapmak iin, HTML formlarda kullandığınız
Checkbox alanlarında olduğu gibi, aynı dizin gnderimi yapmalısınız:
</simpara>
<note>
<para>
oklu dosya ykleme desteği 3.0.10 srmnde eklenmiştir.
</para>
</note>
<para>
<example>
<title>oklu Dosya Ykleme</title>
<programlisting role="html">
<![CDATA[
<form action="file-upload.php" method="post" enctype="multipart/form-data">
Send these files:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Send files">
</form>
]]>
</programlisting>
</example>
</para>
<simpara>
Yukarıdaki form gnderildiğinde, dizinler
<varname>$userfile</varname>,
<varname>$userfile_name</varname>, ve
<varname>$userfile_size</varname> will be formed in
the global scope (as well as in $HTTP_POST_FILES ($HTTP_POST_VARS
in PHP 3)). Bunların her biri, gnderilen dosyaların değerlerini ieren
numaralandırılmış dizin olacaktır.
</simpara>
<simpara>
rneğin, gnderilen dosya adlarının şyle olduğunu varsayalım:
<filename>/home/test/review.html</filename> ve
<filename>/home/test/xwp.out</filename>. Bu durumda,
<varname>$userfile_name[0]</varname>, <filename>review.html</filename> değerini ierir,
ve <varname>$userfile_name[1]</varname> de <filename>xwp.out</filename> değerini ierir.
Bir benzeri de,
<varname>$userfile_size[0]</varname>, <filename>review.html</filename>'in dosya boyutunu ierir. Diğerleri de aynıdır.
</simpara>
<simpara>
<varname>$userfile['name'][0]</varname>,
<varname>$userfile['tmp_name'][0]</varname>,
<varname>$userfile['size'][0]</varname>, ve
<varname>$userfile['type'][0]</varname> de tanımlanmıştır.
</simpara>
</sect1>
<sect1 id="features.file-upload.put-method">
<title>PUT Ynetmi Desteği</title>
<para>
PHP Netscape Composer ve W3C Amaya gibi programların kullandığı HTTP PUT
yntemini de destekler. PUT işlemi, bir dosya ykleme işleminden
daha basittir ve aşağıdaki gibidir:
<informalexample>
<programlisting>
PUT /path/filename.html HTTP/1.1
</programlisting>
</informalexample>
</para>
<para>
Bu şu demektir: dosyayı ykleyen, dosyayı, web dzeniniz iindeki
/path/filename.html iine kaydetmek istemektedir.
Tm kulanıcıların, web dizini iindeki herhangi bir dosyanın zerine yazmak
Apache ve PHP iin kesinlikle iyi bir fikir değildir.
Bu tr bir işlemi kontrol altına almak iin, web sunucunuza byle bir işlem iin
belirli bir PHP dosyasını kullanmasını sylemelisiniz. Apache'de bu işlem <emphasis>Script</emphasis>
direktifi ile yapılmaktadır. Bu direktif, Apache'nin konfigursasyon dosyasında
herhangi bir yere konulabilir. Genellikle <Directory> bloğunun
veya <Virtualhost> bloğunun iine konur.
Bunun gibi bir satır işinizi grecektir:
<informalexample>
<programlisting>
Script PUT /put.php
</programlisting>
</informalexample>
</para>
<simpara>
Bu satır, Apache'ye, tm PUT istemlerini, eklediğimiz satırda bulunan
put.php dosyasına gndermesini syler. Bu rnek, .php uzantısının alışır olduğu
ve PHP nin aktif olduğu varsayılarak verilmiştir.
</simpara>
<simpara>
put.php dosyanızda, şyle birşey yapabilirsiniz:
</simpara>
<para>
<informalexample><programlisting role="php">
<![CDATA[
<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>
]]>
</programlisting></informalexample>
</para>
<simpara>
Bu işlem, dosyayı, işelemi yapan kişinin istediği klasre kopyalar.
Bu kopyalama işlemini gerekleştirmeden nce, bazı kontroler ve/veya
giriş kontrolleri yapmak isteyebilirsiniz.
İstek sonlandığında, bu geici dosya silinir. Dolayısı ile
işlemi gerekleştiren dosyanız, bu dosyayı başka bir yere kopyalamalıdır.
Bu geici klasrdeki dosya adı $PHP_PUT_FILENAME değişkenindedir
ve isteği gnderenin belirlediği dosya adını $REQUEST_URI
(Apache dışındaki web sunucularda değişebilir) değişkeninde grebilirsiniz.
Bu belirtilen dosya adı, dosyayı gnderenin belirlediği dosya adıdır.
Bu isteği gerekleştirmek zorunda değilsinizdir. rneğin
tm dosyaları, belirlediğiniz bir klasre kopyalabilirsiniz.
</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
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
-->
|