diff --git a/security_review.help.inc b/security_review.help.inc
index 9724017..5bc6fed 100644
--- a/security_review.help.inc
+++ b/security_review.help.inc
@@ -383,4 +383,22 @@ function security_review_check_name_passwords_help($results = NULL) {
   }
 
   return $element;
-}
\ No newline at end of file
+}
+
+function security_review_check_executable_php_help($results = NULL) {
+  $element = array();
+  $element['title'] = t('Executable PHP in files directory');
+  $element['descriptions'][] = t("The Drupal files directory is for user-uploaded files and protects against a malicious user executing arbitrary PHP code against your site.");
+
+  $last_check = security_review_get_last_check('security_review', 'executable_php');
+  if ($last_check['skip'] == '1') {
+    $element['findings']['descriptions'][] = _security_review_check_skipped($last_check);
+  }
+  elseif ($last_check['result'] == FALSE) {
+    $directory = variable_get('file_public_path', 'sites/default/files');
+    $element['findings']['descriptions'][] = t('Security Review was able to execute a PHP file written to your files directory. It is recommended that you review your webserver for recommended configuration.');
+    $element['findings']['descriptions'][] = t("If you are using Apache you should check that the .htaccess file at $directory has the correct content.");
+  }
+
+  return $element;
+}
diff --git a/security_review.inc b/security_review.inc
index 66d31e2..b369e79 100644
--- a/security_review.inc
+++ b/security_review.inc
@@ -170,6 +170,12 @@ function _security_review_security_checks() {
       'failure' => t('Untrusted users have access to use the PHP input format.'),
     );
   }
+  $checks['executable_php'] = array(
+    'title' => t('Executable PHP'),
+    'callback' => 'security_review_check_executable_php',
+    'success' => t('PHP files in the Drupal files directory cannot be executed.'),
+    'failure' => t('PHP files in the Drupal files directory can be executed.'),
+  );
 
   return array('security_review' => $checks);
 }
@@ -559,13 +565,37 @@ function _security_review_weak_passwords($trusted_roles) {
   // Explicitly check uid 1 in case they have no roles.
   $weak_uid1 = db_fetch_object(db_query("SELECT u.uid, u.name, 1 AS count FROM {users} u WHERE pass = md5(name) AND uid = 1"));
   if (!empty($weak_uid1->count)) {
-    $weak_users[$weak_uid1->uid] = $weak_uid1->name; 
+    $weak_users[$weak_uid1->uid] = $weak_uid1->name;
   }
 
   return $weak_users;
 }
 
 /**
+ * Check if PHP files written to the files directory can be executed.
+ */
+function security_review_check_executable_php($last_check = NUL) {
+  $result = TRUE;
+  global $base_url;
+  $message = 'Security review test ' . date('Ymdhis');
+  $content = "<?php\necho '" . $message . "';";
+  $directory = variable_get('file_public_path', 'sites/default/files');
+  $file = '/security_review_test.php';
+  if ($file_create = @fopen('./' . $directory . $file, 'w')) {
+    $create_status = fwrite($file_create, $content);
+    fclose($file_create);
+  }
+  $response = drupal_http_request($base_url . '/' . $directory . $file);
+  if ($response->code == 200 && $response->data === $message) {
+    $result = FALSE;
+  }
+  if (file_exists('./' . $directory . $file)) {
+    @unlink('./' . $directory . $file);
+  }
+  return array('result' => $result, 'value' => '');
+}
+
+/**
  * Helper function allows for collection of this file's security checks.
  */
 function security_review_get_checks() {
@@ -736,4 +766,4 @@ function security_review_role_permission($rid, $permission) {
 
 function _security_review_log($module, $check_name, $message, $variables, $type) {
   module_invoke_all('security_review_log', $module, $check_name, $message, $variables, $type);
-}
\ No newline at end of file
+}
