PDA

View Full Version : سوال: جلوگیری از کپی کردن فایل توسط تابع copy



yasgig
شنبه 01 اسفند 1388, 13:56 عصر
با سلام
با استفاده از کد زیر می توان لینک غیر مستقیم واسه دانلود داد.

index.php

<?
// change php.ini gdlibzip
//output_buffering = Off ; Output buffering allows you to send header lines (including cookies)
//zlib.output_compression = On ;
//extension=php_zlib.dll
ini_set('output_buffering','off');
ini_set('zlib.output_compression','On');
//Start Output buffering
ob_start();
$zipfile = false; // if this variable ture the file for download before download compress file

$file = "$_GET[file]";
$fileget = $_GET['file'];
if ($fileget == null)
{
echo '<script>alert("فایلی بری دانلود انتخاب نشده است");</script>';
}else{
if(!file_exists($file)) {
echo '<html><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1256"></head><body></body></html>';
echo '<script>alert("فایل مورد نظر شما وجود ندارد");</script>';
echo '<script>history.back(-1);</script>';
exit;
}
if ($zipfile) {
$file = basename($file);
$ExtDn = pathinfo($file);
$ExtDn = $ExtDn["extension"];
$zipnamefile = substr($file,0, strlen($file)-strlen($ExtDn)) . 'zip';
require('zip.lib.php');
$zipfile = new zipfile($zipnamefile,'', '');
$zipfile->addFileAndRead(basename($file));
echo $zipfile->file();
}
else {
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/x-msdownload");
header("Content-Disposition: attachment; filename=".basename($file).";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
readfile("$file");
}
}
?>

zip.lib.php

<?php

class zipfile {

var $datasec = array();
var $ctrl_dir = array();
var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0;
var $pathToFPDF = NULL;
var $pathToDeepDir = NULL;

function zipfile ($output_filename = 'archive.zip', $DeepDir = './DeepDir.php', $FPDF = './fpdf.php') {

header('Content-Type: application/x-zip');
header('Content-Disposition: inline; filename="' . $output_filename . '"');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');

$this->pathToFPDF = $FPDF;
$this->pathToDeepDir = $DeepDir;

}

function read_File ($file) {

if (is_file($file)) {

$fp = fopen ($file, 'rb');
$content = fread ($fp, filesize($file));
fclose ($fp);

return $content;

}

}

function replaceSuffix ($file, $suffix = 'pdf') {

$arr = explode('.', $file);
unset($arr[count($arr) - 1]);
$file = NULL;
foreach($arr as $v) $file .= $v . '.';
$file .= $suffix;

return $file;

}

function getDirContent ($dirName = './') {

if (is_dir($dirName)) {

if (include($this->pathToDeepDir)) {

$dir = new DeepDir();
$dir->setDir($dirName);
$dir->load();

return $dir->files;

} else {

if ($handle = opendir($dirName)) {

while (false !== ($file = readdir($handle))) {

if (($file != '.') && ($file != '..') && (is_file($file))) {

$content[] = $file;

}

}

closedir($handle);

return $content;

}

}

}

}

function addDirContent ($dir = './') {

foreach ($this->getDirContent($dir) as $input) {
$this->addFileAndRead(str_replace('.//', NULL, $input));
}

}

function addFileAndRead ($file) {

if (is_file($file))
$this->addFile($this->read_File($file), $file);

}

function addFileAsPDF ($file, $title = 'PDF File', $author = 'Anonymous') {
//You need FPDF to use this function!
//get it at http://www.fpdf.org/

if (include($this->pathToFPDF)) {

$pdf = new PDF();
$pdf->Open();

//edit this as you need it

$pdf->SetTitle($title);
$pdf->SetAuthor($author);
$pdf->PrintChapter(1, $author, $file);

//nothing to edit below!

$this->addFile($pdf->getBuffer(), $this->replaceSuffix($file));

} else {

$filecontent = implode(NULL, file($file));

$content .= '********************************************' . "\n";
$content .= '* *' . "\n";
$content .= '* Couldn\'t find FPDF! *' . "\n";
$content .= '* Adding this File as plain text file. *' . "\n";
$content .= '* *' . "\n";
$content .= '* Below this box is the sourcefile. *' . "\n";
$content .= '* *' . "\n";
$content .= '********************************************' . "\n";

$content .= ' ' . "\n";
$content .= ' ' . "\n";
$content .= ' ' . "\n";

$content .= $filecontent;

$this->addFile($content, $file);

}

}

function unix2DosTime($unixtime = 0) {

$timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);

if ($timearray['year'] < 1980) {

$timearray['year'] = 1980;
$timearray['mon'] = 1;
$timearray['mday'] = 1;
$timearray['hours'] = 0;
$timearray['minutes'] = 0;
$timearray['seconds'] = 0;

}

return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |
($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

}

function addFile($data, $name, $time = 0) {

$name = str_replace('\\', '/', $name);

$dtime = dechex($this->unix2DosTime($time));
$hexdtime = '\x' . $dtime[6] . $dtime[7]
. '\x' . $dtime[4] . $dtime[5]
. '\x' . $dtime[2] . $dtime[3]
. '\x' . $dtime[0] . $dtime[1];

eval('$hexdtime = "' . $hexdtime . '";');

$fr = "\x50\x4b\x03\x04";
$fr .= "\x14\x00"; // ver needed to extract
$fr .= "\x00\x00"; // gen purpose bit flag
$fr .= "\x08\x00"; // compression method
$fr .= $hexdtime; // last mod time and date

// "local file header" segment
$unc_len = strlen($data);
$crc = crc32($data);
$zdata = gzcompress($data);
$zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
$c_len = strlen($zdata);
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize
$fr .= pack('v', strlen($name)); // length of filename
$fr .= pack('v', 0); // extra field length
$fr .= $name;

// "file data" segment
$fr .= $zdata;

// "data descriptor" segment (optional but necessary if archive is not
// served as file)
$fr .= pack('V', $crc); // crc32
$fr .= pack('V', $c_len); // compressed filesize
$fr .= pack('V', $unc_len); // uncompressed filesize

// add this entry to array
$this -> datasec[] = $fr;
$new_offset = strlen(implode('', $this->datasec));

// now add to central directory record
$cdrec = "\x50\x4b\x01\x02";
$cdrec .= "\x00\x00"; // version made by
$cdrec .= "\x14\x00"; // version needed to extract
$cdrec .= "\x00\x00"; // gen purpose bit flag
$cdrec .= "\x08\x00"; // compression method
$cdrec .= $hexdtime; // last mod time & date
$cdrec .= pack('V', $crc); // crc32
$cdrec .= pack('V', $c_len); // compressed filesize
$cdrec .= pack('V', $unc_len); // uncompressed filesize
$cdrec .= pack('v', strlen($name) ); // length of filename
$cdrec .= pack('v', 0 ); // extra field length
$cdrec .= pack('v', 0 ); // file comment length
$cdrec .= pack('v', 0 ); // disk number start
$cdrec .= pack('v', 0 ); // internal file attributes
$cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set

$cdrec .= pack('V', $this -> old_offset ); // relative offset of local header
$this -> old_offset = $new_offset;

$cdrec .= $name;

// optional extra field, file comment goes here
// save to central directory
$this -> ctrl_dir[] = $cdrec;

}

function file() {

$data = implode(NULL, $this -> datasec);
$ctrldir = implode(NULL, $this -> ctrl_dir);

return $data .
$ctrldir .
$this -> eof_ctrl_dir .
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"
pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall
pack('V', strlen($ctrldir)) . // size of central dir
pack('V', strlen($data)) . // offset to start of central dir
"\x00\x00"; // .zip file comment length
}

}

?>

به طور مثال از آدرس زیر
www.example.com/?file=11.zip
میشه فایل زیر رو دانلود کرد:
www.example.com/11.zip
حالا چطور می تونم اگه فردی خواست با تابه کپی در پی اچ پی فایل www.example.com/?file=11.zip را به هاست خود کپی کنه جلوگیری کنم؟

با تشکر

yasgig
شنبه 01 اسفند 1388, 18:49 عصر
کسی در این مورد پیشنهادی واسم نداره؟

maysamscript
شنبه 01 اسفند 1388, 20:09 عصر
حالا چطور می تونم اگه فردی خواست با تابه کپی در پی اچ پی فایل www.example.com/?file=11.zip (http://www.example.com/?file=11.zip) را به هاست خود کپی کنه جلوگیری کنم؟عملاً این کار صد درصد شدنی نیست ولی شما میتونید با چک کردن مرورگر ، استفاده از کوکی ، استفاده از کد امنیتی و .. تا حدودی جلوی این کار را بگیرید

yasgig
شنبه 01 اسفند 1388, 20:14 عصر
کد امنیتی به نظر خودمم هم رسیده بود.میشه یه مثال واسه نمایش کد امنیتی قرار بدین تا خودم درستش کنم؟

yasgig
یک شنبه 02 اسفند 1388, 13:21 عصر
ولی این کار پهنا باند رو صد در صد تحت اختیار میگیره !
کدوم کارو می گید؟