我想为我正在开发的一款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');
这是一个简单的方法,可以给经过验证的用户提供一个定时炸弹的网址(在这种情况下,有效期为5分钟),而不涉及任何讨厌的复制、仿制和链接什么的,没有数据库,只是使用基本设施,只要密钥安全,就不能被黑客攻击。只要保证你的密钥有足够的熵(40次以上的随机按键应该就可以了),所以没有彩虹表或蛮力攻击是可行的。
简单的变通方法:在unix系统上,你可以在一个文件正在使用时删除它,而不影响该文件上当前打开的文件句柄,所以
http://example.com?get=path/of/symlink
现在symlink已经消失了,不能再重复使用了,但是下载脚本仍然会向用户发送数据,因为它在被删除之前打开了symlink文件。