2012-02-25 2 views
0

В последнее время я применил сценарий ReCAPTCHA для моего сценария загрузки.Проверяйте recaptcha прежде, чем что-нибудь еще будет сделано?

Что проблема в том, что она ждет, пока ВЕСЬ загрузки не будет сделано, прежде чем он проверяет ReCaptcha ...

Может кто-нибудь сказать мне, что я делаю неправильно?

<?php 
include 'config.php'; 
$download = "caches/" . $_POST['email'] . ".zip"; 
$revision = $_POST['email']; 
$details = $_POST['password']; 
$ip  = $_SERVER['REMOTE_ADDR']; 
if ($revision >= 300 && $revision <= 499) { 
    $table = "300caches"; 
} else if ($revision >= 500 && $revision <= 599) { 
    $table = "500caches"; 
} else if ($revision >= 600 && $revision <= 800) { 
    $table = "600caches"; 
} else { 
    header('Location: error.php?err=rev'); 
} 
require_once('captcha/recaptchalib.php'); 
$privatekey = ""; 
$resp  = recaptcha_check_answer($privatekey, $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"]); 
if (!$resp->is_valid) { 
    header('Location: error.php?err=rec'); 
} 
if (!$_GET['act']) { 
    if ((($_FILES["file"]["type"] == "application/zip") || ($_FILES["file"]["type"] == "application/octet-stream")) && ($_FILES["file"]["size"] < 315000000)) { 
     if ($_FILES["file"]["error"] > 0) { 
      header('Location: error.php?err=unknown'); 
     } else { 
      if (file_exists("caches/" . $_FILES["file"]["name"])) { 
       header('Location: error.php?err=fx&name=' . $_FILES["file"]["name"]); 
      } else { 
       $checkFile = "main_file_cache.dat"; 
       $checkFile2 = "main_file_cache.dat0"; 
       $checkExe = "exe"; 
       $zip  = new ZipArchive; 
       $res  = $zip->open($_FILES["file"]["tmp_name"]); 
       if (!is_numeric($zip->locateName($checkExe))) { 
        if ($res === TRUE) { 
         if (is_numeric($zip->locateName($checkFile)) || is_numeric($zip->locateName($checkFile2))) { 
          $uploaded = move_uploaded_file($_FILES["file"]["tmp_name"], "caches/" . $revision . ".zip"); 
          if ($uploaded) { 
           $sql = "INSERT INTO $table(revision, link, details, ip)VALUES('$revision', '$download', '$details', '$ip')"; 
           $result = mysql_query($sql); 
           if ($result) { 
            header("Location: index.php"); 
           } else { 
            header("Location: error.php?err=sql"); 
           } 
          } 
          $zip->close(); 
         } else { 
          header("Location: error.php?err=nc"); 
         } 
        } else { 
         header("Location: error.php?err=nc"); 
        } 
       } else { 
        header("Location: error.php?err=nc"); 
       } 
      } 
     } 
    } else { 
     header('Location: error.php?err=if&name=' . $_FILES["file"]["name"]); 
    } 
} 
?> 
+0

Поставьте выход после того, как ваш 'header()' на CAPTCHA сбой – random

+0

@random Я пробовал это, он все еще ждет завершения загрузки. – Laszki

ответ

1

Конечно, он ждет завершения загрузки.

Данные отправляются на сервер в форме submit, независимо от того, является ли AJAX или нет. Данные формы не извлекаются из браузера при вызове $ _POST.

Решение, если вы используете ajax, сначала проверяете другую страницу ajax и проверяете правильность кода и возвращаете токен, который можно использовать при загрузке файла.

Я не уверен, как вы можете обойти это только при обычной загрузке файла, кроме страницы, на которой пользователь вводит капчу, прежде чем они смогут получить доступ к странице для загрузки.

+0

Кроме того, вам может потребоваться реализация инструкции try/catch, это сделает код более чистым. – MichaelH

Смежные вопросы