下载后过期的临时URL

问题描述 投票:0回答:4

我想为我正在开发的一款Java游戏创建一个启动器,要求用户在下载游戏之前先登录。我的想法是让启动程序将凭证发送到我的网络服务器,如果凭证正确,网络服务器将输出一个临时文件的位置。然而,这将是一个有点棘手的效率,因为:服务器需要将游戏复制到服务器上。

  1. 服务器需要在每次更新时复制游戏文件,并且
  2. 网络服务器不会知道文件何时下载完毕。

也许启动程序可以向一个单独的脚本发送一个请求,以删除一个给定临时名称的文件?这样做的问题是,启动程序很容易被反编译并修改为不发送请求,从而破坏了创建新文件的目的。

对于这个想法和它的问题,有什么建议吗?

java php download
4个回答
3
投票

我将使用一个数据库,像这样。

urlgenerator.php

 <?php

 // generate code
 $code = uniqid();

 // save code to database
 db_save($code);

 // write link
 echo '<a href="download.php?code=' . $code . '">Download</a>';

下载.php

<?php

// get code from url
$single_use_code = $_GET['code'];

// check if the code is in the db
if(db_get_code($single_use_code)) {
   // remove code from database as it is single use only
   db_remove($single_use_code);
   // start download
   start_download();
} else {
   // the code is not valid
   die('BAD code');
}

1
投票

试试这样的东西。

// Define a random key
$key = 'kgjiowtjiohgjiut09ig90im09yig90mi903i490ti209tgwgt';  
$secondsValid = 300;

if($_GET['action'] == 'download')
{
  $time = $_GET['time'];
  if(time() - $time > $secondsValid)
    die('Code has expired, please try again');
  if($_GET['validation'] != md5($time.$key))
    die('Invalid validation code');
  DownloadFile();
  die;
}
elseif(CredentialsAreCorrect())
{
  $time = time();
  header('Location: '.$_SERVER['REQUEST_URI'].'?action=download&time='.$time.'&validation='.md5($time.$key));
  die;
}
else
  die('Invalid credentials');

这是一个简单的方法,可以给经过验证的用户提供一个定时炸弹的网址(在这种情况下,有效期为5分钟),而不涉及任何讨厌的复制、仿制和链接什么的,没有数据库,只是使用基本设施,只要密钥安全,就不能被黑客攻击。只要保证你的密钥有足够的熵(40次以上的随机按键应该就可以了),所以没有彩虹表或蛮力攻击是可行的。


0
投票

简单的变通方法:在unix系统上,你可以在一个文件正在使用时删除它,而不影响该文件上当前打开的文件句柄,所以

  1. 用户要求下载
  2. 脚本在documentroot的某个地方建立了一个符号链接,指向文件真正存放的地方(文档根目录之外的某个地方)。
  3. 符号链接的URL作为参数发送给用户。
  4. 用户点击donwload链接,比如说。http://example.com?get=path/of/symlink
  5. 下载脚本fopen()的符号链接,并开始分发文件的内容。
  6. 脚本 REMOVES 的符号链接。

现在symlink已经消失了,不能再重复使用了,但是下载脚本仍然会向用户发送数据,因为它在被删除之前打开了symlink文件。

© www.soinside.com 2019 - 2024. All rights reserved.