为防止资源包被盗刷,故通过程序控制下载频次

function down(){
    try {
		$ip=request()->ip();
		if(!$ip){
			echo "<script>alert('当前网络异常!');setTimeout(()=>{window.history.back();},3000);</script>";
			exit;
		}
		Cache::store('redis')->set('ossAppIpDownInfo:'.$ip.":".date("YmdHis"), $system, 3600);
		$accessKeyId = 'LTAxxxxxxxxxxxxxxxxxx';
		$accessKeySecret = 'suxxxxxxxxxxxxxxxxxxxxxxxx';
		$endpoint = 'oss-cn-hangzhou.aliyuncs.com';
		$bucket = 'down';
		$stsArr = Cache::store('redis')->get('ossDownSts');
		if(!isset($stsArr['AccessKeyId'])){
			$sts = new StsServer([
				'AccessKeyID'     => $accessKeyId,
				'AccessKeySecret' => $accessKeySecret,
				'RoleArn'         => 'acs:ram::8888888888888888:role/down',
				'BucketName'      => $bucket,
				'Endpoint'        => $endpoint,
				'RegionId'        => 'cn-hangzhou',
				'RoleSessionName' => 'external-username',
				'TokenExpireTime' => 900, // sts超时秒
			]);
			$rts = $sts->getOssDownSts();
			if (isset($rts['StatusCode']) && $rts['StatusCode']==200 && $rts['AccessKeyId'] && $rts['AccessKeySecret'] && $rts['SecurityToken']) {
				$stsArr=[
					'AccessKeyId'=>$rts['AccessKeyId'],
					'AccessKeySecret'=>$rts['AccessKeySecret'],
					'SecurityToken'=>$rts['SecurityToken']];
				Cache::store('redis')->set('ossDownSts',$stsArr,898);
			}else{
				echo "<script>alert('下载失败!');setTimeout(()=>{window.history.back();},3000);</script>";
				return '';
			}
		}
		$num=Cache::store('redis')->get('ossAppIpDownNum:'.$ip);
		$num=$num??0;
		$options = array(
			"response-content-disposition"=>"attachment",
		);
		//限速规则,随时调整
		if($num==1) {
			$options[OssClient::OSS_TRAFFIC_LIMIT]=81920000;//10M
		}else if($num==2){
			$options[OssClient::OSS_TRAFFIC_LIMIT]=40960000;//5M
		}else if($num>2 && $num<5){
			$options[OssClient::OSS_TRAFFIC_LIMIT]=8192000;//1M
		}else if($num>=5 && $num<10){
			$options[OssClient::OSS_TRAFFIC_LIMIT]=819200;//100KB
		}else if($num>=10){
			echo "<script>alert('下载失败!');setTimeout(()=>{window.history.back();},3000);</script>";
		}
		$num+=1;
		$ossClient = new OssClient($stsArr['AccessKeyId'], $stsArr['AccessKeySecret'], 'https://'.$endpoint,true,$stsArr['SecurityToken']);
		$signedUrl = $ossClient->signUrl($bucket, 'myApp.apk', 3,'GET',$options);
		$signedUrl = str_replace('https://'.$endpoint,'https://down.xxx.com',$signedUrl);
		Cache::store('redis')->set('ossAppIpDownNum:'.$ip, $num, 43200);
		header("Location:" . $signedUrl);
	} catch (Exception $e) {
		echo "<script>alert('下载失败!');setTimeout(()=>{window.history.back();},3000);</script>";
	}
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐