diff -urp ./includes/file.inc ../drupalnew/includes/file.inc --- ./includes/file.inc 2010-05-21 09:53:32.000000000 -0400 +++ ../drupalnew/includes/file.inc 2010-05-21 13:29:15.000000000 -0400 @@ -1167,28 +1167,36 @@ function file_save_upload($source, $vali return FALSE; } - // Build the list of non-munged extensions. - // @todo: this should not be here. we need to figure out the right place. - $extensions = ''; - foreach ($user->roles as $rid => $name) { - $extensions .= ' ' . variable_get("upload_extensions_$rid", - variable_get('upload_extensions_default', 'jpg jpeg gif png txt html doc xls pdf ppt pps odt ods odp')); + // File extension validation is required for security purposes. + if (!isset($validators['file_validate_extensions'])) { + // Fallback to a safe list of extensions if the caller didn't pass them in. + $validators['file_validate_extensions'] = array('jpg jpeg gif png txt doc xls pdf ppt pps odt ods odp'); } + // Build the list of non-munged extensions. + $extensions = $validators['file_validate_extensions'][0]; + // Begin building file object. $file = new stdClass(); $file->uid = $user->uid; $file->status = 0; + // Munging is required to protect against possible malicious extension hiding + // within an unknown file type. ie: filename.php.foo $file->filename = file_munge_filename(trim(basename($_FILES['files']['name'][$source]), '.'), $extensions); $file->uri = $_FILES['files']['tmp_name'][$source]; $file->filemime = file_get_mimetype($file->filename); $file->filesize = $_FILES['files']['size'][$source]; - // Rename potentially executable files, to help prevent exploits. - if (preg_match('/\.(php|pl|py|cgi|asp|js)$/i', $file->filename) && (substr($file->filename, -4) != '.txt')) { + // Rename potentially executable files, to help prevent exploits. Don't + // rename if 'allow_insecure_uploads' evaluates to TRUE. + if (!variable_get('allow_insecure_uploads', 0) && preg_match('/\.(php|pl|py|cgi|asp|js)(\.|$)/i', $file->filename) && (substr($file->filename, -4) != '.txt')) { $file->filemime = 'text/plain'; $file->uri .= '.txt'; $file->filename .= '.txt'; + // The .txt extension may not be in the allowed list of extensions. We have + // to add it here or else the file upload will fail. + $validators['file_validate_extensions'][0] .= ' txt'; + drupal_set_message(t('For security reasons, your upload has been renamed to %filename.', array('%filename' => $file->filename))); } // If the destination is not provided, use the temporary directory. diff -urp ./modules/file/file.field.inc ../drupalnew/modules/file/file.field.inc --- ./modules/file/file.field.inc 2010-05-21 09:53:32.000000000 -0400 +++ ../drupalnew/modules/file/file.field.inc 2010-05-21 12:51:00.000000000 -0400 @@ -122,9 +122,10 @@ function file_field_instance_settings_fo '#type' => 'textfield', '#title' => t('Allowed file extensions'), '#default_value' => $extensions, - '#description' => t('Separate extensions with a space or comma and do not include the leading dot. Leaving this blank will allow users to upload a file with any extension.'), + '#description' => t('Separate extensions with a space or comma and do not include the leading dot.'), '#element_validate' => array('_file_generic_settings_extensions'), '#weight' => 1, + '#required' => TRUE, ); $form['max_filesize'] = array( @@ -545,7 +546,6 @@ function file_field_widget_upload_valida // There is always a file size limit due to the PHP server limit. $validators['file_validate_size'] = array($max_filesize); - // Add the extension check if necessary. if (!empty($instance['settings']['file_extensions'])) { $validators['file_validate_extensions'] = array($instance['settings']['file_extensions']); }