Обслуживание загрузки после отправки формы с проверкой - PullRequest
5 голосов
/ 23 сентября 2011

Я создал довольно простой инструмент загрузки кода загрузки в .php (благодаря помощи здесь) и с трудом пытаюсь выяснить, какой лучший способ обеспечить загрузку, если проверка прошла успешно. В основном -

Пользователь вводит неверный код -> страница обновляется с сообщением об ошибке. Пользователь вводит правильный код -> Дать загрузку «Сохранить как» -> обновить страницу.

В тот момент, когда я использую http://www.zubrag.com/scripts/download.php для обслуживания файла, но как только он начал загружаться, моя форма обновляет страницу, но загружает только половину содержимого?

Это форма с PHP-скриптом, который я сделал.

<div class="dcrForm">
    <p>Have a physical copy of this release? Claim your digital download by entering your Download Code below.</p>
    <form  action="index.php" method="post">
        <input type="text" name="code" class="dcrInput" value="">
        <input type="submit" name="harrisSubmit" class="dcrSubmit" value="Submit">
    </form>
<?php
    include("scripts/dcr_config.php");
    $code="";
    $log="";

    if (isset($_POST['harrisSubmit']))
    {
        $code=$_POST['code'];

        $link = mysql_connect($hostname, $dbusername, $dbpassword);
        mysql_select_db("$databasename");

        $query = "select count from $harris where code='$code'";
        if ($q=mysql_query($query))
            if ($r=mysql_fetch_array($q)){
                if ($r[0]<3)
                {
                    $subquery="update $tbname set count='".($r[0]+1)."' where code='$code'";
                    mysql_query($subquery);
                    ?><script>window.location.href="download.php?f=test.txt";</script><?php
                }
            }
        $log="<p>Invalid code. Try Again.</p>";
    }
    echo $log."";
?>
</div>

У кого-нибудь есть идеи о том, каким будет лучший способ загрузки? Я знаю, что в настоящее время любой, кто имел местоположение файла, мог загрузить файл, но я не уверен, как я мог бы защитить i

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

Я рад, что вы сделали это так далеко!

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

В приведенном выше сценарии вместо вывода javascript для перенаправления в сценарий загрузки можно выполнить следующее:

<?php

include "scripts/dcr_config.php";
$code = "";
$log  = "";

if (isset($_POST['harrisSubmit'])) {
    $code = trim($_POST['code']);

    $link = mysql_connect ( $hostname, $dbusername, $dbpassword );
    mysql_select_db ( "$databasename" );

    $code = mysql_real_escape_string($code); // very important! protects against exploits

    $query = "select count from $harris where code='$code'";
    if ($q = mysql_query ( $query )) {
        if ($r = mysql_fetch_array ( $q )) {
            if ($r [0] < 3) {
                $subquery = "update $tbname set count='" . ($r [0] + 1) . "' where code='$code'";
                mysql_query ( $subquery );

                $file = '/path/to/protecteddownload.txt';

                // send file to browser as a download dialog
                // no content can be output prior to these header() calls
                header('Content-type: application/octet-stream');
                header('Content-Disposition: attachment; filename="file.txt"');
                header('Content-Length: ' . filesize($file));
                header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
                header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

                echo file_get_contents($file);
                exit; // terminate script
            } else {
                $log = 'Sorry, this code has already been redeemed.';
            }
        } else {
            $log = 'Invalid download code.  Try again.';
        }
    } else {
        // query failed
        $log = 'An error occurred validating your code, please try again later.';
    }

    $log = "<p>Invalid code. Try Again.</p>";
}

?>

<?php if (isset($log) && $log != ''): ?>
<strong class="error"><?php echo $log ?></strong>
<?php endif; ?>

<div class="dcrForm">
<p>Have a physical copy of this release? Claim your digital download by
entering your Download Code below.</p>
<form action="index.php" method="post"><input type="text" name="code"
    class="dcrInput" value=""> <input type="submit" name="harrisSubmit"
    class="dcrSubmit" value="Submit"></form>
</div>

Скрипт загрузкивероятно похоже на то, что я имею выше.Ключевым моментом в этом примере является то, что файл, который вы обслуживаете с помощью file_get_contents, недоступен из Интернета.Вы отправляете его только после ввода действительного кода.

1 голос
/ 29 сентября 2011

У меня есть только один быстрый вопрос, насколько велик этот файл? Может ли быть так, что при чтении файла в браузере происходит тайм-аут php?

Вы можете поиграть с настройками php, чтобы подтвердить это (http://php.net/manual/en/function.set-time-limit.php).

Только мои 2 цента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...