2014-02-14 3 views
0

У меня есть сценарий, который позволяет любому пользователю загружать файл до 200 МБ и после того, как файл будет загружен после его удаления, и через 24 часа все файлы будут удалены с сервера. Мой вопрос в том, как я могу ограничить количество случаев, когда кто-то может загрузить файл, например. Если кто-то должен был загрузить 3 файла за один час, если они должны были загрузить 4-й файл, им нужно будет ввести код-код для проверки, чтобы они не были роботом. Но как мне это сделать?Предельные загрузки пользователей PHP

код для загрузки:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 

    <script> 
    function _(el){ 
    return document.getElementById(el); 
    } 

    function uploadFile(){ 
    var file = _("file1").files[0]; 
    //alert(file.name+" | "+file.size+" | "+file.type); 
    var formdata = new FormData(); 
    formdata.append("file1", file); 
    var ajax = new XMLHttpRequest(); 
    ajax.upload.addEventListener("progress", progressHandler, false); 
    ajax.addEventListener("load", completeHandler, false); 
    ajax.addEventListener("error", errorHandler, false); 
    ajax.addEventListener("abort", abortHandler, false); 
    ajax.open("POST", "upload.php"); 
    ajax.send(formdata); 
    } 

    function progressHandler(event){ 
    //_("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total; 
    var percent = (event.loaded/event.total) * 100; 
    var percent = (event.loaded/event.total) * 100; 
    _("progressBar").value = Math.round(percent); 
    _("status").innerHTML = Math.round(percent)+'%'; 
    } 

    function completeHandler(event){ 
    _("completed").innerHTML = event.target.responseText; 
    _("progressBar").value = 100; 
    } 

    function errorHandler(event){ 
    _("status").innerHTML = "Upload Failed"; 
    } 

    function abortHandler(event){ 
    _("status").innerHTML = "Upload Aborted"; 
    } 
    </script> 

    <body> 

    <input type="button" value="Upload File" onclick="uploadFile()" class="UploadButton"> 
    <progress id="progressBar" value="0" max="100"> 
    </progress> 
    </body> 

php upload script: 

    <?php 

    include('connect.php'); 
    $file = $_FILES["file1"]["name"]; 

    if ($file == "") { 
    // if file not chosen 
    exit(); 
    } 

    $ogname = $_FILES["file1"]["name"]; 
    // The file name 

    $length = 20; 
    $randomString =  substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0,  $length); 

    $num = rand() ; 
    $key = md5($num); 

    $info = pathinfo($ogname); 
    $ext = $info['extension']; 

    $fileName = $randomString . "." .$ext; 

    //gets ip address of client  
    //Test if it is a shared client 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
    $ip=$_SERVER['HTTP_CLIENT_IP']; 
    //Is it a proxy address 
    }elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
    }else{ 
    $ip=$_SERVER['REMOTE_ADDR']; 
    } 

    //returns ip to be stored later 
    $downloads = 0; 
    $time = 0; 
    $fileTmpLoc = $_FILES["file1"]["tmp_name"]; 

    // File in the PHP tmp folder 
    $fileType = $_FILES["file1"]["type"]; 
    // The type of file it is 
    $fileSize = $_FILES["file1"]["size"]; 

    if($fileSize > 209715201){ 
    // if too large 
    exit(); 
    } 

    // File size in bytes 
    $fileErrorMsg = $_FILES["file1"]["error"]; // 0 for false... and 1 for true 
    if (!$fileTmpLoc) { 
    // if file not chosen 
    exit(); 
    } 
    if(move_uploaded_file($fileTmpLoc, "files/$fileName")) 
    { 

    //success 

       mysql_query("INSERT INTO file(name, ogname, type, size,  tmp_name, keyID, ip, time, downloads) 
       VALUES('$fileName', '$ogname', '$fileType',  '$fileSize',  '$fileTmpLoc', '$key', '$ip', '$downloads', '$time')"); 

    }else { 
    //not uploaded 
    } 
    ?> 

ответ

1

Прежде всего, вам нужен способ рассказать одному пользователю от другого.

Если пользователи должны войти на ваш сайт, прежде чем они могут загрузить эти файлы, то эта часть проста: вы знаете, какой пользователь загружает каждый файл, так как они вошли в

Если нет - и если. вы не хотите добавить требование входа в систему - вам придется придерживаться другого подхода. Существует два возможных подхода, оба из которых несовершенны:

a. Предположим, что каждый уникальный IP-адрес, найденный в $_SERVER['REMOTE_ADDR'], является отдельным пользователем.

Это несовершенно, потому что разные пользователи иногда имеют один и тот же IP-адрес (например, если они посещают ваш сайт из одной и той же корпоративной сети), поэтому этот подход может ошибочно заключить, что пользователь превысил свою квоту (даже хотя они этого не сделали).

или

б. Использовать PHP sessions; он специально предназначен для уникальной идентификации посетителей.

Это несовершенно, потому что это легко обойти - пользователь может очистить свои файлы cookie или использовать другой браузер, и сайт будет думать, что они другой пользователь.

Если вам нужен жесткий предел, который нельзя обойти, то вам потребуется логин. Если лимит загрузки более вежливый, и это не конец света, если кто-то обходит его, то вам нужно выбрать, что для вас важнее: немного лучше (но все еще довольно слабая) безопасность, за счет некоторых ложных срабатываний (выберите вариант a) или немного лучше, удобство для пользователя, за счет снижения безопасности (выберите вариант b).

+0

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

0

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

+0

Это то, что я планировал делать, кроме как бы определить, было ли это в течение определенного периода времени? Как и первая временная метка + другие два> ограничение по времени –

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