0

我想为我正在开发的 Java 游戏创建一个启动器,该启动器需要用户登录才能下载游戏本身。我的想法是让启动器将凭据发送到我的网络服务器,如果凭据正确,网络服务器将输出临时文件的位置。但是,鉴于以下情况,这将有点棘手/效率低下:

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

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

关于这个想法及其问题的任何建议?

4

3 回答 3

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');
}
于 2013-04-21T18:07:58.207 回答
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');

这是一种简单的方法,可以为经过验证的用户提供定时炸弹 URL(在这种情况下有效 5 分钟),无需任何讨厌的复制/符号链接/涉及任何内容,无需数据库,只需使用基本设施,只要密钥是安全的,就不会被黑客入侵. 只要确保你的密钥有足够的熵(40+ 随机按键应该做到这一点),所以没有彩虹表或暴力攻击是可行的。

于 2013-04-21T18:09:16.207 回答
0

简单的解决方法:在 unix 系统上,您可以在文件正在使用时删除它,而不会影响该文件上当前打开的文件句柄。所以

  1. 用户请求下载
  2. 脚本在 documentroot 中的某个位置创建一个符号链接,该链接指向文件实际存储的位置(文档根目录之外的某个位置)
  3. 符号链接的 URL 作为参数发送给用户。
  4. 用户点击下载链接,例如http://example.com?get=path/of/symlink
  5. 下载脚本 fopen() 是符号链接并开始输出文件的内容
  6. 脚本在 fopen()'d 后删除符号链接

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

于 2013-04-21T18:05:27.023 回答