PDA

View Full Version : جلوگیری از دانلود مستقیم فایلها



shervin_agh67
چهارشنبه 07 آبان 1393, 10:48 صبح
من یک سایت برای دانلود و آپلود فایل طراحی کردم. ولی می خوام سیستم دانلود فایلها یه چیزی شبیه رپیدشیر باشه. یعنی کاربر نتونه به صورت مستقیم فایل رو دانلود کنه و باید از فیلتری که من براش تعریف می کنم عبور کنه. یه چیزی شبیه url routing منتها به این صورت که آدرس مجازی بعد از یه مدت نامعتبر بشه و برنامه هایی مثل دانلود منجر نتونن محل اصلی فایل رو پیدا کنن.

vbnovin
دوشنبه 19 آبان 1393, 15:28 عصر
خوب خسته نباشيد همين ... برنامه را بذار ما هم ياد بگيريم ممنون

korosh00
دوشنبه 19 آبان 1393, 17:46 عصر
متاسفانه کسی جواب درستی که ما بتونیم ازش استفاده کنیم و عملی برامون کار کنه هنوز نداده .
لطفا دوستان این مشکل رو با ی نمونه کوچیک توضیح بدن .
ممنون

Mohammad_dn
دوشنبه 19 آبان 1393, 19:02 عصر
پیاده کردن این موضوع اونقدرا پیچیده نیست....راهی که همین الآن به نظرم میرسه(با این حال که خیلی فکرم درگیره) اینه که:
-ابتدا فایل رو آپلود میکنید و برای این فایل یک کلید در نظر میگیرید(داخل بانک کلید،آدرس مستقیم فایل و ...قرار میگیره)
-وقتی کاربر میخواد فایل رو دانلود کنه به صفحه ای مشابه Download.aspx?key=15935 ارجاع داده میشود
حالا باید توی این صفحه یک دکمه برای تولید لینک داشته باشیم
برای این کار به یک تیبل جداگانه نیاز داریم
مثلا:
id
key
datetimenow
datetimevalid
وقتی کاربر روی لینک کلیک میکنه اطلاعات لازم داخل این تیبل ذخیره میشه:
key=@key
datetimenow=datetime.now
datetimevalid=datetime.now.adddey(1)
خوب ...درواقع ما الآن آدرس مجازی ایجاد کردیم...اما حالا چطور دانلود کنه کاربر؟؟
وقتی این اتفاقات افتاد به کاربر لینک نهایی رو میدیم..مثلا:Download.aspx?id=1240
در واقع اون 1240 همون فیلد id در تیبل دوم هست...وقتی این صفحه باز میشه :

--بر اساس id رکورد مد نظر رو واکشی میکنیم
--به فیلد datetimevalid نگاه میکنیم که ببینیم آیا زمانی که در این فیلد تعریف شده از زمان حال کم تر هست یا نه..(اگر کمتر باشه یعنی هنوز از زمانش نگذشته)
--اگر این زمان کمتر از زمان حال بود اونوقت به فیلد key نگاه میکنیم و با استفاده از این کلید (که در ابتدا برای فایل ایجاد کردیم) اطلاعات فایل و محل واقعیه فایل رو از تیبل اول به دست میاریم
--خوب..کار تمومه حالا فقط کافیه با یه دستور فایل رو رایت کنیم(برای دانلود آمادش کنیم) ...این کد توی اینترنت زیاده (یکم بگردید پیدا میکنید)
--تموم شد..حالا کاربر میتونه دان کنه

نکته:توی بالا من یک سال برای دانلود وقت دادم(datetimevalid=datetime.now.adddey(1)) شما میتونید هر جور که خواستید تغییرش بدید

موفق ، پیروز و سربلند باشید

MDN

korosh00
دوشنبه 19 آبان 1393, 19:10 عصر
میگم میشه شما کدی که تو اینترنت هست و زیاد هم هست را برای من پیدا کنید .
من هر چی میگردم چیزی گیرم نمیاد.
لطفا لینکش را بگذارید .
ممنون

Mohammad_dn
دوشنبه 19 آبان 1393, 21:25 عصر
این کد اون قسمتی که گفتم بگردید تو اینترنتم هست..
باقی چیزام که توضیح دادم


public bool DownloadFile(HttpContext httpContext, string filePath, long speed)
{
bool ret = true;
try
{
switch (Request.HttpMethod.ToString().ToUpper())
{ //support Get and head method
case "GET":
case "HEAD":
case "POST":
break;
default:
Response.StatusCode = 501;
return false;
}
if (!System.IO.File.Exists(filePath))
{
Response.StatusCode = 404;
return false;
}



long startBytes = 0;
int packSize = 1024 * 10; //read in block,every block 10K bytes
string fileName = Path.GetFileName(filePath);
FileStream myFile = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(myFile);
long fileLength = myFile.Length;

int sleep = (int)Math.Ceiling(1000.0 * packSize / speed);//the number of millisecond
string lastUpdateTiemStr = System.IO.File.GetLastWriteTimeUtc(filePath).ToStr ing("r");
string eTag = HttpUtility.UrlEncode(fileName, Encoding.UTF8) + lastUpdateTiemStr;

//validate whether the file is too large
if (myFile.Length > Int32.MaxValue)
{
Response.StatusCode = 413;
return false;
}

if (Request.Headers["If-Range"] != null)
{

if (Request.Headers["If-Range"].Replace("\"", "") != eTag)
{
Response.StatusCode = 412;
return false;
}
}

try
{

Response.Clear();
Response.Buffer = false;
//Response.AddHeader("Content-MD5", GetMD5Hash(myFile));
Response.AddHeader("Accept-Ranges", "bytes");
Response.AppendHeader("ETag", "\"" + eTag + "\"");
Response.AppendHeader("Last-Modified", lastUpdateTiemStr);
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" +

HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", "%20"));
Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
Response.AddHeader("Connection", "Keep-Alive");
Response.ContentEncoding = Encoding.UTF8;
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
string[] range = Request.Headers["Range"].Split(new char[] { '=', '-' });
startBytes = Convert.ToInt64(range[1]);
if (startBytes < 0 || startBytes >= fileLength)
{
return false;
}
}
if (startBytes > 0)
{
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength - 1, fileLength));
}


//send data
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int)Math.Ceiling((fileLength - startBytes + 0.0) / packSize);//download in block
for (int i = 0; i < maxCount && Response.IsClientConnected; i++)
{
Response.BinaryWrite(br.ReadBytes(packSize));
Response.Flush();
if (sleep > 1) Thread.Sleep(sleep);
}

}
catch
{
ret = false;
}
finally
{
br.Close();
myFile.Close();
}
}
catch
{
ret = false;
}
return ret;
}
private static string GetMD5Hash(FileStream myFile)
{
throw new NotImplementedException();
}
public HttpContext var { get; set; }




طریقه ی استفاده:


bool bln = DownloadFile(var, Server.MapPath("~/" + strFileAdd), 10000000000000000);

korosh00
دوشنبه 19 آبان 1393, 22:37 عصر
ممنون
ولی من می خوام تا اینجا اومدی کاملش کنی دیگه به اروری چیزی نخورم .
اگه امکان داره برات تا اینجا اومدی جدول رو با اکسس طراحی کن و برنامه رو کامل بزار تا اجرا کردم کار کنه .
واقعا اینقدر روی این کار کردم حوضله ای ندارم هی به ارور بخورم .
ممنون

Mohammad_dn
دوشنبه 19 آبان 1393, 22:51 عصر
باشه میزارم...به زودی

Mohammad_dn
سه شنبه 20 آبان 1393, 00:09 صبح
اینم از نمونه سورس:

تیبل ها:

CREATE TABLE [dbo].[Files] (
[Id] NVARCHAR (MAX) NOT NULL,
[Address] NVARCHAR (MAX) NOT NULL
);



CREATE TABLE [dbo].[Links] (
[Id] NVARCHAR (MAX) NOT NULL,
[FileID] NVARCHAR (MAX) NOT NULL,
[DateTimeValid] DATETIME NOT NULL
);


رمز فایل:www.arax-group.ir

korosh00
سه شنبه 20 آبان 1393, 11:13 صبح
تشکر
الان لینک رو میده ولی وقتی روش کلیک می کنم file not Error میده .
در ضمن برای هر فایل که آپلود میشه ی پوشه میسازه؟

Mohammad_dn
سه شنبه 20 آبان 1393, 18:26 عصر
الان لینک رو میده ولی وقتی روش کلیک می کنم file not Error میده .

دیتا بیس رو چک کنید...پروژه مشکلی نداره...کانکشن استرینگ رو در web.config تنظیم کنید


در ضمن برای هر فایل که آپلود میشه ی پوشه میسازه؟
بله..برای اینکه فایل های تکراری حذف نشن ...میتونید خودتون تغییرش بدید که البته ممکنه یکم به مشکل بر بخورید

korosh00
سه شنبه 20 آبان 1393, 18:38 عصر
کانکشن رو درست ست کردم .
چون آپلود میشه و در تیبل مربوط به لینک هم همه ثبت میشه
ولی وقتی روی create link کلیک میشه هیچ چیزی نمایش نمیده .

حالا اصلا چجوری کار میکنه نکنه من اشتباه دارم باهاش کار می کنم .
من یک فایل رو آپلود کردم بهم ی لینک داد .
روی لینک کلیک می کنم که ارور میده .
پس اون صفحه create link برای چی هست ؟
ممنون

Mohammad_dn
سه شنبه 20 آبان 1393, 19:03 عصر
فایل رو آپلود میکنید...برنامه لینک فایل رو بهتون میده...برای دانلود روی لینک کلیک میکنید در صفحه ی باز شده بر روی Create Link کلیک میکنید تا لینک موقت برای دانلود فایل رو بهتون بده ....حالا با کلیک بر روی این لینک میتونید دانلود کنید

korosh00
سه شنبه 20 آبان 1393, 21:18 عصر
خوب همین دیگه .
روی لینک کلیک میکنم نمیره صفحه create link
الان صفحه پایین لینک رو ساخته روش کلیک می کنم باید بره صفحه createlink خوب نمیره اونجا ارور میده

Mohammad_dn
سه شنبه 20 آبان 1393, 22:07 عصر
خوب پس مشکل از توهه...توی عکس خودت ببین ...به دو تا url ها نگاه کن متوجه میشی....تنظیمات سایت رو میرزون کن ..یا آدرس دهی رو عوض کن

korosh00
چهارشنبه 21 آبان 1393, 08:34 صبح
راستش متوجه نشدم چکار کنم ؟
من همیشه همینجوری همه کارهام رو می کردم .
الان یک لینک درست شده و من روش کلیک می کنم ارور میده .
میشه واضح تر بگی دقیق چکار کنم .
ممنون

Mohammad_dn
چهارشنبه 21 آبان 1393, 14:25 عصر
از منوی website گذینه ی start option رو انتخاب کن...توی صفحه ی باز شده احتمالا باید گذینه ی دوم(Specific Page) برای شما فعال باشه...اگه فعاله گذینه ی اول (Use Current Page) رو انتخاب کن
بعد ok کن...اگه نشد دوباره به همین مسیر برو گذینه ی دوم رو انتخاب کن توی کادر که برات باز میشه(جای نوشتن) یدونه علامت / (اسلش) بزار

http://5.235.234.229:2020/Download.aspx?key=kqtj4fshdabepbgd3shhbzld_5467929

این یه نمونه از فایل آپلود شدست که اگه میخوای ببینی

korosh00
چهارشنبه 21 آبان 1393, 15:57 عصر
من روی strat option کلیک می کنم هیچ عملی انجام نمیشه ؟؟؟!!!
هیچی باز نمیشه

korosh00
چهارشنبه 21 آبان 1393, 15:59 عصر
نمونه هم گذاشتید کار نمیکنه

Mohammad_dn
چهارشنبه 21 آبان 1393, 16:01 عصر
من روی strat option کلیک می کنم هیچ عملی انجام نمیشه ؟؟؟!!!
باید باز بشه


نمونه هم گذاشتید کار نمیکنه
به خاطر اینکه کامپیوترم خاموش بود حالا چک کنید

Mohammad_dn
چهارشنبه 21 آبان 1393, 16:02 عصر
توجه کنید که هر لینک 2 دقیقه اعتبار داره

korosh00
چهارشنبه 21 آبان 1393, 16:18 عصر
خوب مثل اینکه برای من مشکل داره .
حالا اون گزینه start option برای من کار نمیکنه .
اونم چه علتی داره نمی دونم .

Mohammad_dn
چهارشنبه 21 آبان 1393, 16:28 عصر
توی قسمت Solution Explorer روی پروژت کلیک کن...بعد برو توی قسمت Properties یه گذینه داره که برای تو احتمالا باید توش این نوشته باشه:/Download ...اینو تغییر بده و بزار /
اگه اینم نشد یه پروژه ی جدید باز کن (خالی) فایل web.config ای که خودش تولید کرده رو هم پاک کن بعد تمام فایل های این پروژه رو بکش بیار توش(این حتما میشه)

korosh00
چهارشنبه 21 آبان 1393, 16:41 عصر
خوب الان گزینه start option کار کرد و روی اولی بود بردم روی تیک دوم باز نشد .
کلا کارهای start option را گفتی کردم نشد .
حالا بریزم دوباره ببینم چی میشه .
ممنون