2014-02-14 71 views
0

我有一個腳本,允許任何人上傳200 MB以下的文件,並在文件下載完成後將其刪除,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。假設在$_SERVER['REMOTE_ADDR']中找到的每個唯一IP地址都是不同的用戶。

這是不完善的,因爲不同的用戶有時具有相同的IP地址(例如,如果他們從同一公司網絡訪問您的網站),所以這種方法可能會錯誤地認爲用戶超出了配額儘管他們沒有)。

或,

灣使用PHP sessions;它專門設計用於唯一識別訪客。

這一個是不完美的,因爲它很容易規避 - 用戶可以清除他們的cookie,或使用不同的瀏覽器,並且網站會認爲他們是不同的用戶。

如果您需要一個無法繞過的硬限制,那麼您需要登錄。如果上傳限制更多的是禮節性的,並且如果有人碰巧繞過它,那麼這不是世界末日,那麼您需要選擇哪一個對您更重要:安全性稍好一些(但仍然非常弱)的某些誤報(選擇選項a),或稍微好一點的用戶友好性,但代價是安全性較差(選擇選項b)。

+0

我不想添加登錄系統來提高上傳和下載文件的速度,但只要它不會佔用我所有的服務器資源,我就可以以較低的安全性生活。謝謝您的回答。 –

0

您需要識別用戶和跟蹤,以他們有多少文件,至今已上傳的方式。 我可能會使用一個數據庫存儲標識值的組合(例如IP,主機,瀏覽器)並保留一個帶有時間戳的計數器。

+0

這就是我正在計劃要做的事情,除了如何確定它是否在特定時間段內呢?像第一時間戳+其他兩個>時間限制 –