2011-09-22 21 views
5

मैंने .php में एक बहुत ही सरल डाउनलोड कोड रिडीमर बनाया है (यहां से मदद करने के लिए धन्यवाद) और मुझे यह पता लगाने में कठिनाई हो रही है कि डाउनलोड करने का सबसे अच्छा तरीका क्या है अगर सत्यापन सफल है। असल में -फॉर्म सबमिट करने के बाद डाउनलोड करना w/validation

उपयोगकर्ता अमान्य कोड में प्रवेश करता है -> पृष्ठ त्रुटि संदेश से ताज़ा किया जाता है। उपयोगकर्ता मान्य कोड दर्ज करता है -> डाउनलोड करें 'के रूप में सहेजें' -> पृष्ठ रीफ्रेश करें।

मिनट में मैं फ़ाइल की सेवा के लिए 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> 

किसी को भी क्या पर एक विचारों की सेवा के लिए डाउनलोड सबसे अच्छा तरीका होगा है? मुझे पता है कि वर्तमान में कोई भी फ़ाइल स्थान फ़ाइल फ़ाइल डाउनलोड कर सकता है लेकिन मुझे यकीन नहीं है कि मैं

उत्तर

4

की सुरक्षा के बारे में कैसे जा सकता हूं, मुझे खुशी है कि आपने इसे अभी तक बना दिया है!

यदि आप उपयोगकर्ता को डाउनलोड स्क्रिप्ट पर रीडायरेक्ट करने जा रहे हैं, तो उस स्क्रिप्ट को अनधिकृत डाउनलोड को रोकने के लिए कुछ प्रकार के टोकन को संलग्न करने की आवश्यकता होगी, मूल रूप से दिए गए कोड या टोकन को फिर से सत्यापित करना होगा।

ऊपर स्क्रिप्ट में, जावास्क्रिप्ट outputting आप ऐसा कर सकता है डाउनलोड स्क्रिप्ट पर रीडायरेक्ट करने के बजाय:

<?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 के साथ सेवा कर रही है, वह वेब से उपलब्ध नहीं है। वैध कोड दर्ज होने पर ही आप इसे भेजते हैं।

+0

हाय फिर से खींचा, धन्यवाद, यह एक बहुत उपयोगी परियोजना थी। मैंने आपके उपर्युक्त समाधान की कोशिश की है, लेकिन अगर मैं वेब से सुलभ किसी स्थान पर $ फ़ाइल सेट करता हूं और फ़ाइल नाम को उस पर बदलता हूं, तो मैं कोई संकेत नहीं देता हूं और पृष्ठ रीफ्रेश होता है और केवल आधा लोड करता है! – Bantros

+0

क्या आप पूर्ण या सापेक्ष पथ का उपयोग कर रहे हैं? – dizas

+0

मैंने आपके कोड की संरचना को थोड़ा सा बदल दिया है, क्योंकि यदि आप हेडर भेजना चाहते हैं, तो ऐसा करने से पहले कोई HTML या व्हाइटस्पेस आउटपुट नहीं हो सकता है, खासकर यदि हम डाउनलोड करना चाहते हैं। क्या कोड के उस ब्लॉक के ऊपर कोई अन्य HTML है जो शीर्षलेख भेजता है जो उदाहरण में नहीं दिखाया गया था? यदि ऐसा है तो सुनिश्चित करें कि डाउनलोड करने वाली स्क्रिप्ट फ़ाइल की सेवा करने से पहले कोई अन्य आउटपुट नहीं है। पहले जवाब देने के लिए खेद है, मुझे इनबॉक्स संदेश याद करना होगा। – drew010

1

मेरे पास सिर्फ 1 त्वरित प्रश्न है, यह फ़ाइल कितनी बड़ी है? क्या यह एक मामला हो सकता है कि ब्राउज़र में फ़ाइल पढ़ने के दौरान PHP टाइमआउट का अनुभव किया जा रहा है?

आप इसकी पुष्टि करने के लिए php सेटिंग्स के साथ खेल सकते हैं (http://php.net/manual/en/function.set-time-limit.php)।

बस मेरे 2 सेंट

+0

मैंने कभी इसके बारे में सोचा नहीं, यह लगभग 250 एमबी के आसपास एक .zip है – Bantros

संबंधित मुद्दे