yohgaki         Mon Jan 28 02:59:19 2002 EDT

  Modified files:              
    /phpdoc/en/features file-upload.xml 
  Log:
  Promote track vars instead of globals.
  Added more pitfalls.
  
  
  
Index: phpdoc/en/features/file-upload.xml
diff -u phpdoc/en/features/file-upload.xml:1.28 phpdoc/en/features/file-upload.xml:1.29
--- phpdoc/en/features/file-upload.xml:1.28     Wed Dec 12 15:46:34 2001
+++ phpdoc/en/features/file-upload.xml  Mon Jan 28 02:59:19 2002
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.28 $ -->
+<!-- $Revision: 1.29 $ -->
  <chapter id="features.file-upload">
   <title>Handling file uploads</title>
 
@@ -50,62 +50,35 @@
    </para>
 
    <para>
-    In PHP, the following variables will be defined within the
-    destination script upon a successful upload, assuming that <link
-    linkend="ini.register-globals">register_globals</link> is turned
-    on in <filename>php.ini</filename>. If <link
-    linkend="ini.track-vars">track_vars</link> is turned on, they will
-    also be available in PHP within the global array
-    <varname>$HTTP_POST_VARS</varname>. Note that the following
-    variable names assume the use of the file upload name 'userfile',
-    as used in the example above:
-
-    <itemizedlist>
-     <listitem>
-      <simpara>
-       <varname>$userfile</varname> - The temporary filename in which
-       the uploaded file was stored on the server machine.
-      </simpara>
-     </listitem>
-     <listitem>
-      <simpara>
-       <varname>$userfile_name</varname> - The original name or path
-       of the file on the sender's system.
-      </simpara>
-     </listitem>
-     <listitem>
-      <simpara>
-       <varname>$userfile_size</varname> - The size of the uploaded
-       file in bytes.
-      </simpara>
-     </listitem>
-     <listitem>
-      <simpara>
-       <varname>$userfile_type</varname> - The mime type of the file
-       if the browser provided this information.  An example would be
-       "image/gif".
-      </simpara>
-     </listitem>
-    </itemizedlist>
-    Note that the "$userfile" part of the above variables is
-    whatever the name of the INPUT field of TYPE=file is in the upload
-    form.  In the above upload form example, we chose to call it
-    "userfile"
+    Variables defined for uploaded files differs depends on PHP
+    version and configuration. Following variables will be defined
+    within the destination script upon a successful upload. When <link
+    linkend="ini.track-vars">track_vars</link> is enabled,
+    $HTTP_POST_FILES/ $_FILES array is initialized.  <link
+    linkend="ini.track-vars">track_vars</link> is always on from PHP
+    4.0.3. Finally, related variables may be initialized as globals
+    when <link linkend="ini.register-globals">register_globals</link>
+    is turned on . However, use of globals is not recommended anymore.
    </para>
-
+   <note>
+    <para>
+     <link linkend="ini.track-vars">track_vars</link> is always on
+    from PHP 4.0.3. From PHP 4.1.0 or later, $_FILES may be used
+    instead of
+    <varname>$HTTP_POST_FILES</varname>. <varname>$_FILES</varname> is
+    always global, so <literal>global</literal> is should not be used
+    for $_FILES in function scope.
+    </para>
+   </note>
    <para>
-    In PHP 4, the behaviour is slightly different, in that the new
-    global array <varname>$HTTP_POST_FILES</varname> is provided to
-    contain the uploaded file information. This is still only
-    available if <link linkend="ini.track-vars">track_vars</link> is
-    turned on, but <link linkend="ini.track-vars">track_vars</link> is
-    always turned on in versions of PHP after PHP 4.0.2.
+    <varname>$HTTP_POST_FILES</varname>/<varname>$_FILES</varname> is
+    provided to contain the uploaded file information. 
    </para>
 
    <para>
     The contents of <varname>$HTTP_POST_FILES</varname> are as
     follows. Note that this assumes the use of the file upload name
-    'userfile', as used in the example above:
+    'userfile', as used in the example script above:
     <variablelist>
      <varlistentry>
       <term><varname>$HTTP_POST_FILES['userfile']['name']</varname></term>
@@ -144,6 +117,50 @@
      </varlistentry>
     </variablelist>
    </para>
+   <note>
+    <para>
+     PHP3 does not support $HTTP_POST_FILES.
+    </para>
+   </note>
+
+   <para>
+    When <link linkend="ini.register-globals">register_globals</link>
+    is turned on in <filename>php.ini</filename>. Note that the
+    following variable names assume the use of the file upload name
+    'userfile', as used in the example script above:
+
+    <itemizedlist>
+     <listitem>
+      <simpara>
+       <varname>$userfile</varname> - The temporary filename in which
+       the uploaded file was stored on the server machine.
+      </simpara>
+     </listitem>
+     <listitem>
+      <simpara>
+       <varname>$userfile_name</varname> - The original name or path
+       of the file on the sender's system.
+      </simpara>
+     </listitem>
+     <listitem>
+      <simpara>
+       <varname>$userfile_size</varname> - The size of the uploaded
+       file in bytes.
+      </simpara>
+     </listitem>
+     <listitem>
+      <simpara>
+       <varname>$userfile_type</varname> - The mime type of the file
+       if the browser provided this information.  An example would be
+       "image/gif".
+      </simpara>
+     </listitem>
+    </itemizedlist>
+    Note that the "$userfile" part of the above variables is
+    whatever the name of the INPUT field of TYPE=file is in the upload
+    form.  In the above upload form example, we chose to call it
+    "userfile"
+   </para>
 
    <para>
     Files will by default be stored in the server's default temporary
@@ -167,13 +184,14 @@
      <programlisting role="php">
 <![CDATA[
 <?php 
-if (is_uploaded_file($userfile)) {
-    copy($userfile, "/place/to/put/uploaded/file");
+// PHP 4.1.0 or later, $_FILES may be usedd instead of $HTTP_POST_FILES
+if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
+    copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
 } else {
-    echo "Possible file upload attack: filename '$userfile'.";
+    echo "Possible file upload attack: filename '".$HTTP_POST_FILES['userfile'".".";
 }
 /* ...or... */
-move_uploaded_file($userfile, "/place/to/put/uploaded/file");
+move_uploaded_file($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
 ?>
 ]]>
      </programlisting>
@@ -191,20 +209,21 @@
      <programlisting role="php">
 <![CDATA[
 <?php
+// PHP 4.1.0 or later, $_FILES may be usedd instead of $HTTP_POST_FILES
 /* Userland test for uploaded file. */ 
-function is_uploaded_file($filename) {
+function is_uploaded_file($HTTP_POST_FILES['filename']) {
     if (!$tmp_file = get_cfg_var('upload_tmp_dir')) {
         $tmp_file = dirname(tempnam('', ''));
     }
-    $tmp_file .= '/' . basename($filename);
+    $tmp_file .= '/' . basename($HTTP_POST_FILES['filename']);
     /* User might have trailing slash in php.ini... */
-    return (ereg_replace('/+', '/', $tmp_file) == $filename);
+    return (ereg_replace('/+', '/', $tmp_file) == $HTTP_POST_FILES['filename']);
 }
 
-if (is_uploaded_file($userfile)) {
-    copy($userfile, "/place/to/put/uploaded/file");
+if (is_uploaded_file($HTTP_POST_FILES['userfile'])) {
+    copy($HTTP_POST_FILES['userfile'], "/place/to/put/uploaded/file");
 } else {
-    echo "Possible file upload attack: filename '$userfile'.";
+    echo "Possible file upload attack: filename '".$HTTP_POST_FILES['userfile']".".";
 }
 ?>
 ]]>
@@ -215,12 +234,12 @@
     The PHP script which receives the uploaded file should implement
     whatever logic is necessary for determining what should be done
     with the uploaded file.  You can for example use the
-    <varname>$file_size</varname> variable to throw away any files
-    that are either too small or too big.  You could use the
-    <varname>$file_type</varname> variable to throw away any files
-    that didn't match a certain type criteria.  Whatever the logic,
-    you should either delete the file from the temporary directory or
-    move it elsewhere.
+    <varname>$HTTP_POST_FILES['file_size']</varname> variable to throw
+    away any files that are either too small or too big.  You could
+    use the <varname>$HTTP_POST_FILES['file_type']</varname> variable
+    to throw away any files that didn't match a certain type criteria.
+    Whatever the logic, you should either delete the file from the
+    temporary directory or move it elsewhere.
    </simpara>
    <simpara>
     The file will be deleted from the temporary directory at the end
@@ -235,6 +254,18 @@
     greater than the file size that has been set in the <link
     linkend="ini.upload-max-filesize">upload_max_filesize</link> ini-setting.
     The default is 2 Megabytes.
+   </simpara>
+   <simpara>
+    If memory limit is enabled, larger <link
+    linkend="ini.memory-limit">memory_limit</link> may be needed. Make
+    sure to set <link linkend="ini.memory-limit">memory_limit</link>
+    large enough.
+   </simpara>
+<!-- FIXME: max_execution_time INI -->
+   <simpara>
+    If <literal>max_execution_time</literal> is set too small, script
+    execution may be exceeded the value. Make sure to set
+    <literal>max_execution_time</literal> large enough.
    </simpara>
    <simpara>
     Not validating which file you operate on may mean that users can access


Reply via email to