如何在Laravel中生成安全的一次性下载链接?

时间:2019-02-18 05:09:40

标签: php laravel security

我有一个用于销售教学视频的移动应用程序。

我需要生成一个唯一的一次性下载链接,以将其显示在我的应用程序中。

该应用程序基于API,并且我正在使用Laravel后端框架。我保存了所有从android发送的设备ID。

如何为每个用户购买的任何设备的产品生成链接?

4 个答案:

答案 0 :(得分:1)

您可以使用“签名URL”(Laravel> = 5.6)。这些URL附加了“签名”哈希。下一个方法创建一个签名的URL

URL::signedRoute('video.download', ['user_id' => 1, 'video_id'=1]);

如果您想生成一个过期的临时签名路由URL,则可以使用secondarySignedRoute方法:

URL::temporarySignedRoute(
    'unsubscribe', now()->addMinutes(30), ['user' => 1]
); 

Laravel文档: https://laravel.com/docs/5.7/urls#signed-urls

答案 1 :(得分:0)

为每个用户设置unique key,并在下载时随请求发送密钥。

当用户请求产品时,请检查密钥是否已经存在,并检查密钥belongs to是否是用户。

答案 2 :(得分:0)

您可以为每个使用购买的应用程序生成唯一令牌。

$token = sha1(uniqid(time(), true));

有下载请求时,您可以销毁

$url = "http://example.com/activate.php?token=$token";

您可以检查相应用户的令牌并执行所需的操作。

谢谢

答案 3 :(得分:0)

如果您不想自己进行设置,我提供了一个小包装,可帮助您创建使用寿命有限且点击次数有限的签名URL。

https://github.com/linkeys-app/signed-url/

这将为您提供比laravel提供的内置签名URL更多的功能,因为您可以设置过期前对链接的点击次数。在这种情况下,您只需要使用:

Link::generate('myurl.com/download', ['user' => 1, 'video' => 5], null, 1);

这将允许您将数据附加到链接,不给它指定有效日期(尽管将有效日期传递给第三个参数将使链接在给定的时间到期),并且仅允许单击一次,直到该链接到期。 / p>