Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 生成ip和限时下载链接_Php_Download - Fatal编程技术网

Php 生成ip和限时下载链接

Php 生成ip和限时下载链接,php,download,Php,Download,有一个下载文件的直接链接。用户可以在付款后下载该链接,如下所示: http://example.com/download/webapp.rar 但我需要生成ip和有时间限制的下载链接,以防止他人窃取文件。我想在不使用任何数据库的情况下执行此操作。大概是这样的: http://example.com/download.php?a5fds588fgdf <?php $salt = 'SALTING'; // Hash cipher $key = new stdClass(); $key-&

有一个下载文件的直接链接。用户可以在付款后下载该链接,如下所示:

http://example.com/download/webapp.rar
但我需要生成ip和有时间限制的下载链接,以防止他人窃取文件。我想在不使用任何数据库的情况下执行此操作。大概是这样的:

http://example.com/download.php?a5fds588fgdf
<?php
$salt = 'SALTING'; // Hash cipher
$key = new stdClass();
$key->limit = time()+3600; // 1 hour limit
$key->ip = $_SERVER['REMOTE_ADDR'];
$key->security = sha1(sha1($salt.serialize($key))); // Double sha1 for fun

$key_param = base64_encode(serialize($key));

echo sprintf('http://mysite.com/download/%s', $key_param);
?>


有什么建议吗?

如果您不担心人们能够解码某些参数,如IP或时间戳,您可以尝试以下方法:

http://example.com/download.php?a5fds588fgdf
<?php
$salt = 'SALTING'; // Hash cipher
$key = new stdClass();
$key->limit = time()+3600; // 1 hour limit
$key->ip = $_SERVER['REMOTE_ADDR'];
$key->security = sha1(sha1($salt.serialize($key))); // Double sha1 for fun

$key_param = base64_encode(serialize($key));

echo sprintf('http://mysite.com/download/%s', $key_param);
?>

现在,这是为了获得ip$key->ip的唯一密钥,有效时间为1小时

要验证它,请执行以下操作:

<?php
$salt = 'SALTING';
$key = $_GET['key'];
$key = base64_decode($key);
$key = unserialize($key);
if($key->security != sha1(sha1($salt.serialize($key)) || $_SERVER['REMOTE_ADDR'] != $key->ip) {
    throw new Exception('Security breach. U mad bro ?');
}
?>

我最重要的建议是使用数据库

但是,如果您绝对必须在没有缓存的情况下执行此操作,那么我建议使用缓存库,如cache lite:

许多PHP框架(如果您正在使用的话)也附带了缓存库


您可以缓存分配的IP和随机密钥以及到期日期(一些缓存库还允许您分配缓存有效期)

有一个非常好的nginx模块可以做到这一点

URL得到两个参数——我们称它们为s(安全性)和t(时间戳)。安全性是由时间戳、路径和salt生成的安全哈希(在您的情况下,只需添加ip)

要验证:

$ip = $_SERVER['REMOTE_ADDR'];
$salt = 'change me cause im not secure';
$path = $_SERVER['REQUEST_URI'];
$hashGiven = $_GET['s'];
$timestamp = $_GET['t'];
$hash = md5($salt . $ip . $timestamp . $path);
if($hashGiven == $hash && $timestamp <= time()) {
    // serve file
} else {
    die('link expired or invalid');
}
我不太熟悉apache重写,所以您可以自己检查一下

如果您使用的是以下模块之一,您不需要自己验证所有这些,这在性能方面会更好,但请注意,它提供了更多配置,有时还提供了另一种生成url和哈希的方法(请参阅此处的模块文档)

或者您只需使用nginx安全链接模块:

还有一个用于lighty的吊坠:

或nginx安全下载模块:


也许apache也有一些东西。。。也许你可以在那里重写一些东西…

“没有任何数据库”?这是什么要求?要解决这个问题,您必须存储一些数据,而数据库是迄今为止最好的存储位置。你到底为什么试图避免使用数据库?如果没有数据库,你可以通过设置它们的
到期日来使用
cookies
实现这一点。然而,问题是,你可以删除cookies。所以这不是一个可靠的方法。@GhazanfarMir……事实上,cookies很容易被欺骗,使它们在这方面几乎毫无用处……WTF对“没有数据库”的事情太难了,以至于我没有注意到“绑定到IP”的东西。那是个糟糕的主意。IP地址不是固定的,用于支付下载费用的地址和用于开始下载的地址不必匹配。这就是为什么没有人这样做。我注意到的典型方案是将下载次数限制在5次左右。尽量减少“偷窥”,而不要完全欺骗你的合法用户。@meagar我不想使用DB,因为我的网站不是DB驱动的。@Tom谢谢,我必须在哪里设置我的文件名“webapp.rar”?@NuLLeR-Well,我在哪里回显你的URL?@Tom-Well-put!简明扼要地说,我想补充一点,那就是我和我的搭档创建了一个类似类型的脚本。。。(由于在这里推销产品是不礼貌的,所以将不会被提及)但我们实际上在上面Tom提到的$key中插入了一些信息。添加各种各样的机会——比如“推荐人”检查、流媒体(仅举几个例子),等等。。。还要注意url的限制,因为你的眼睛会扩展到该url中几乎所有内容的base64编码:)@Tom-也不要忘记验证方面的时间限制检查($key->limit checking…)我认为问题在于,哈希对所有下载都有效。您需要考虑请求uri,以便哈希仅对服务器上的特定文件有效!谢谢@Hikaru Shindo谢谢伙计,你能把我的示例链接放到你的脚本上吗(用于我的测试)@NuLLeR我已经重写了我的答案以匹配你的示例,并添加了更多需要考虑的信息。可以使用ID和数据库等。是的。只需在逻辑中使用它,并在本例中使用路径的任何地方使用它即可
因此接收方脚本中的散列路径没有拉入查询变量,并且
$timestamp=time()
location /download {
    rewrite ^.*$ /download.php last;
    break;
}