ژ.ب ١٨٠٣

داڕشتنی سیستەمی داگرتن، پاراستنی بەستەری داگرتن


هەندێک جار بە هەر هۆکارێک بێت لەوانەیە پێویست بکات بەستەری داگرتنی کاتیی بۆ داگرتنەکانی نێو ماڵپەڕەکەمان درووست بکەین، بە شێوەیەک کە هەر بەستەرێک بۆ ماوەیەکی کاتیی دیاریکراو کار بکات. هەروەها بەستەری ڕاستەقینەی پەڕگە داگیراوەکە دەپارێزێت و دۆزینەوەی ئاسان نابێت.

بیرۆکەی سەرەوە بە هاوکاری زمانی PHP ڕوون دەکەمەوە. بەڵام بە شێوەیەکی گشتیی هەمان بیرۆکە بۆ زمانەکانی دیکەش کار دەکات.

ئەم نموونەیە لەسەر ئەو بنەمایە دەنووسم کە بوخچەیەکمان هەیە بە ناوی downloads و دواتر کۆمەڵێک پەڕگەی لە خۆ گرتووە، زانیارییەکانی ئەو پەڕگانە لە نێو Table‌ـێکی تایبەت دا لە MySQL پاشەکەوت کراون. وەک نموونەی خوارەوە

ئەوەی کە گرینگە، پێویستە ناوی پەڕگە لە بنکەی  دراوەدا تۆمار کرابێت. کۆدەکانی درووستکردنی Table لە خوارەوە هەیە.

دیزاینی بنکەی دراوەی سیستەمی داگرتن

نموونەی داتای نێو خشتەی داگرتن

وەک لە نموونەی سەرەوە ڕوونە، لە بنکەی دراوە ناوی دوو پەڕگەمان هەیە، هەمان دوو پەڕگە لە نێو بوخچەی downloads هەن.

ئەو کۆدەی کە دەینووسین لەسەر ئەو بنەمایە کار دەکات کە ٣ پەڕەمان هەیە index.php, download.php و config.php، پەڕەی یەکەم بەستەری داگرتنەکانی لە خۆ گرتووە کە میوانانی ماڵپەڕ کرتەی لێدەکەن بۆ داگرتنی هەر پەڕگەیەک.
پەڕگەی دووەم کاری شاردنەوەی بەستەری ئەسڵی پەڕگە دەکات و بە بەستەرێکی تایبەتەوە داگرتنەکە بۆ بەکارهێنەر ئامادە دەکات.

لە config.php زانیارییەکانی پەیوەندیکردن بە بنکەی دراوە دەنووسین، لەگەڵ Variable ـێک بۆ لە خۆ گرتنی وشەیەکی تایبەت و نهێنی کە هاوکاریمان دەکات بۆ باشتر شاردنەوەی بەستەرەکانی داگرتن. پێویستە تۆ ئەو وشە نهێنییە بگۆڕیت بۆ دانەیەکی دیکە کە تەنیا خۆت بیزانیت، گرینگ نییە چی دەنووسیت.

<?php 
// وشەی تایبەت بۆ باشتر تێکەڵ کردنی بەستەرەکانی داگرتن و شاردنەوەیان
$salt = 'SczTqwdC5jRqKAvm';
$domain = 'http://www.domain.com';

$hostname = "localhost";
$database = "downloads";
$username = "root";
$password = "";
$con = mysql_connect($hostname, $username, $password); 
mysql_select_db($database, $con);
mysql_query("SET NAMES 'UTF8'");
?>

پەڕگەی یەکەم، index.php دەبێت و لە نێو هەمان بوخچەی downloads پاشەکەوتی دەکەین.
کۆدەکانی خوارەوە لە خۆ دەگرێت،

<?php include("config.php"); ?>
<!doctype html>
<html lang="ckb" dir="rtl">
<head>
    <meta charset="UTF-8">
    <title>لیستی پەڕگە</title>
    <style>
    .error{
    border: solid 1px #c1002c;
    background: #fac8d4;
    color: #4d4d4d;
    font-weight: bold;
    padding: 10px;
    border-radius: 5px;
    margin: 5px;
    }
    </style>
</head>
<body>
    <?php
    if(isset($_GET['error']) && $_GET['error'] == "1"){
    echo '<div class="error">
    بەستەری داگرتن هەڵەیە
    </div>';
    }
    ?>
    <ul>
    <?php 
    $query_items = "SELECT id, file_name, title FROM downloads ORDER BY id DESC LIMIT 10";
    $query = @mysql_query($query_items);
    while($row = @mysql_fetch_array($query)){
    
    // درووستکردنی hash ی تایبەت بە پەڕگە بۆ داگرتن، دواتر ئەم hash ـە لەگەڵ هی پەڕگەی داگرتن بەراورد دەکەین بۆ دڵنیابوون لەوەی کە هەردووکیان وەک یەکن
    $file_name_hash = md5($row['file_name']);
    $day_hash = md5(date('Y-m-d'));
    $salt = md5($salt);
    $all_hash = md5($file_name_hash.$day_hash.$salt);
    echo '<li><a href="'.$domain.'/download.php?id='.$row['id'].'&file='.$all_hash.'">'.$row['title'].'</a></li>';
    }
    ?>
    </ul>
</body>
</html>

کۆدەکانی سەرەوە ئەو کارانەی خوارەوە جێبەجێ دەکەن،
١، پەیوەندی دەکات بە بنکەی دراوەوە و ناوی ١٠ دواتر پەڕگە دەهێنێت.
٢، بە هاوکاری Function ی md5 لە PHP، ناوی پەڕگەکان "تشفیر" دەکەین.
٣، هەروەها ڕێکەوتی ئەمڕۆ (هەموو ڕۆژێک دەگۆڕدرێت بۆ ئەو ڕۆژەی کە چالاکە).
٤، ناوی و پەڕگە و ڕێکەوتی ئەمڕۆ لەگەڵ وشەی نهێنی نێو config.php تێکەڵ دەکات و لە کۆتاییدا Hash ـێکی تایبەت بە هەرسێ بەشەکە درووست دەکات.
٥، چوونکە ڕێکەوتمان دیاری کردووە، ئەو کاتە هەر بەستەرێكی داگرتن بۆ ماوەی ٢٤ کاتژمێر کار دەکات. ئەگەر کەسێکیش بەستەری داگرتنەکانی نێو ماڵپەڕەکەت ڕوونووس بکات، بۆ خۆیان پاش ٢٤ کاتژمێر لە کار دەکەون. پێویست دەکات لە ماڵپەڕی خۆتەوە پەڕگەکان دابگیردرێن. ئەمەش تایبەتمەندییەکی سادە و بە توانایە بۆ ڕێگرتن لە Leech، واتە بە ئەو شێوازەش Anti-Leech ـت داناوە.
٦، لە کۆتاییدا، بۆ هەر داگرتنێک بەستەرێکی تایبەت درووست دەبێت وەک هی خوارەوە،

http://www.domain.com/download.php?id=2&file=0c5edd6f0b801b6fd9332ce82ebbdcab

لە بەستەری سەرەوە ناوی پەڕگە شاردراوەتەوە.
پەڕگەی downlad.php
لە download.php چێک دەکەین ئایا ئەو بەستەرەی کە داوا کراوە بەستەرێکی درووستە؟ کاتەکەی تێنەپەڕیووە؟ ئەگەر بێ کێشە بوو ئەو کاتە داگرتن بۆ بەکارهێنەر دەست پێدەکات.

کۆدەکانی نێو download.php بریتی دەبن لە،

<?php include("config.php"); ?>
<!doctype html>
<html lang="ckb" dir="rtl">
<head>
    <meta charset="UTF-8">
    <title>داگرتنی پەڕگە</title>
</head>
<body>
    <ul>
    <?php
    if(isset($_GET['id']) && isset($_GET['file'])){
    
    // وەرگرتنی نرخی Query ـەکان و خاوێن کردنیان
    $id = intval($_GET['id']);
    $file = mysql_real_escape_string($_GET['file']);
    
    $query_items = "SELECT id, file_name FROM downloads WHERE id = '$id' LIMIT 1";
    $query = @mysql_query($query_items);
    while($row = @mysql_fetch_array($query)){
    
    // دووبارە درووستکردنەوەی hash بۆ چێک کردنی بەستەر و هەروەها لەوەی ئایا کاتەکەی بەسەرچووە یان نە
    $file_name_hash = md5($row['file_name']);
    $day_hash = md5(date('Y-m-d'));
    $salt = md5($salt);
    $all_hash = md5($file_name_hash.$day_hash.$salt);
    
    // ئەگەر hash ـەکان وەک یەک بوون، ئەو کاتە دیارە بەستەرەکە بێ کێشەیە و پەڕگەی ویستراو بانگ دەکەین
    if($file === $all_hash){
    $file = $row['file_name'];
    $ext = pathinfo($file, PATHINFO_EXTENSION);
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: attachment; filename=$all_hash.$ext");
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: binary");
    readfile($file);
    }
    
    else{
    header('Location: '.$domain.'/index.php?error=1');
    }
    
    }
    // کۆتایی MySQL Query
    
    }
    // کۆتایی IF ISSET
    else{
    header('Location: '.$domain.'/index.php?error=1');
    }
    ?>
    </ul>
</body>
</html>

کۆدەکانی هەموو ٣ پەڕگەی سەرەوە لەگەڵ پەڕگەی SQL بۆ درووستکردنەوەی Table ی تایبەت بە داگرتن لە بەستەری خوارەوە هەن بۆ داگرتن.

داگرتنی سکریپتی تایبەت بە داگرتن / Download System Script

لە کۆتاییدا بەستەرەکانی داگرتن لە ئەو شێوازە،

http://www.domain.com/downloads/a-file-to-download.zip


دەگۆڕدرێن بۆ،

http://www.domain.com/download.php?id=2&file=0c5edd6f0b801b6fd9332ce82ebbdcab

تێبینییەکی گرینگ: تایبەتمەندیی readfile لە PHP، فایل بانگ دەکاتە نێو Memory سیستەم بۆ ئەوەی بتوانێت Serve ی بکات بۆ Client. ئەگەر پەڕگەیەک قەبارەی گەورە بێت درووست نییە readfile بەکار ببات بۆ Serve بوون.

ئەگەر بە نیازیت کە کۆدەکانی سەرەوە لە بنکەیەکی داگرتن بەکار ببەیت کە پەڕگەی قەبارە گەورەی لە خۆ گرتووە، پێویستە readfile بەکار نەبەیت. بەڵکوو mod_xsendfile ئەو کارە باشتر جێبەجێ دەکات. Module ی ناوبراو بۆ Apache هەیە. کاری ئەوەیە Serve کردنی ئەو پەڕگە گەورانە لە PHP ـەوە بگوازێتەوە بۆ Apache. بە ئەو شێوەیەش Load نابنە نێو Memory.

زانیاری زۆرتر و بەستەری داگرتنی mod_xsendfile لە ئەم بەستەرە هەیە.

تكایه‌ هه‌ژمارێك درووست بكه‌ بۆ ئه‌وه‌ی بتوانیت بۆچوون بنووسیت، كرته‌ له‌ ئێره‌ بكه‌ بۆ درووستكردنی هه‌ژمار