我想为我正在开发的 Java 游戏创建一个启动器,该启动器需要用户登录才能下载游戏本身。我的想法是让启动器将凭据发送到我的网络服务器,如果凭据正确,网络服务器将输出临时文件的位置。但是,鉴于以下情况,这将有点棘手/效率低下:
- 每次有人更新时,服务器都需要复制游戏文件,并且
- 网络服务器不知道文件何时完成下载。
也许启动器可以向单独的脚本发送请求以删除给定临时名称的文件?这样做的问题是启动器很容易被反编译和修改为不发送请求,从而破坏了创建新文件的目的。
关于这个想法及其问题的任何建议?
我会使用一个数据库,如下所示:
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');
}
尝试这样的事情:
// 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+ 随机按键应该做到这一点),所以没有彩虹表或暴力攻击是可行的。
简单的解决方法:在 unix 系统上,您可以在文件正在使用时删除它,而不会影响该文件上当前打开的文件句柄。所以
http://example.com?get=path/of/symlink
现在符号链接消失了,不能再重复使用了,但是下载脚本仍然会向用户发送数据,因为它在删除之前打开了符号链接/文件。