WhyCan Forum(哇酷开发者社区)

人过留名,雁过留声,感谢各位朋友不离不弃地支持。 QQ: 516333132, 微信: whycan_cn (哇酷网/挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2020-03-14 15:54:29

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

用 php 测试 阿里云的 oss 对象存储云服务

1. 安装php:

sudo apt-get install php php-curl php-mbstring -y

2. 安装阿里云php oss sdk:

composer require aliyuncs/oss-sdk-php

3. 建立一个测试程序:

test.php 说:

<?php

require_once __DIR__ . '/vendor/autoload.php';

use OSS\OssClient;
use OSS\Core\OssException;

$accessKeyId = "你的阿里云oss key id";
$accessKeySecret = "你的key密码";
$endpoint = "oss-cn-beijing.aliyuncs.com";

try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
} catch (OssException $e) {
    print $e->getMessage();
}

$bucket= "pythinker";
$object = "filename.txt";
$content = "Hello, OSS!"; // Content of the uploaded file

try {
    $ossClient->putObject($bucket, $object, $content);
} catch (OssException $e) {
    print $e->getMessage();
}
?>

4. 运行

php test.php

这样在阿里云oss对象存储服务器新建 filename.txt 文件成功了。

参考: https://github.com/aliyun/aliyun-oss-php-sdk

离线

#2 2020-03-14 15:56:22

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

Re: 用 php 测试 阿里云的 oss 对象存储云服务

现在我有一个问题,如果用MSVC/Qt做一个windows本地 oss 应用程序, 如何才能保护好 秘钥?

离线

#3 2020-03-16 09:55:47

vultr
会员
注册时间: 2020-02-26
累计积分: 24

Re: 用 php 测试 阿里云的 oss 对象存储云服务

pythinker 说:

现在我有一个问题,如果用MSVC/Qt做一个windows本地 oss 应用程序, 如何才能保护好 秘钥?

这个问题也是我曾经纠结过的问题,不过阿里云已经考虑到了:

https://help.aliyun.com/document_detail/28953.html

https://help.aliyun.com/document_detail/100690.html

离线

#4 2020-03-16 11:46:31

超级萌新
会员
注册时间: 2018-05-04
累计积分: 403

Re: 用 php 测试 阿里云的 oss 对象存储云服务

刚刚试了一下csdn的下载,果然是用阿里云oss:

以下是原始链接:

https://dl-download.csdn.net/down11/20180910/281b1770422234908d9bbced58ae3608.pdf?response-content-disposition=attachment%3Bfilename%3D%22Debian8_X1000E.pdf%22&security-token=CAISgwJ1q6Ft5B2yfSjIr5fjE%2BLihb4VjvGOQ03rs3gYVulvjZGZ1Dz2IHxFf3FoCOEYv%2Fk1nWlU6%2FoTlqF%2FTIBDQUvNYZOmfHCyF0XzDbDasumZsJYw6vT8a1fxZjf%2F2MjNGaCbKPrWZvaqbX3diyZ32sGUXD6%2BXlujQ%2BDr6Zl8dYY4UxX6D1tBH8wEAgp5tI1gQhm3D%2Fu2NQPwiWf9FVdhvhEG6Vly8qOi2MaRmHG85R%2FYsrZJ%2FtuvecD%2FMJI3Z8kvC4uPsbYoJvab4kl58ANX8ap6tqtA9Arcs8uVa1sruEnXaLKMo4wxfVIjP%2FFmRvIVtprnieY9tuiWkJ%2Fs25qImF%2BBkY61GoABjZSSnBaFysh2HJIV%2F94El6HH5hgHUomaqTLQmfUA9BrDbOrIC3yS7lZkjVEtgKZLXqgQKfw4hNZUE2lFiJESdYABl%2FPDzk%2F3tM75Nm6ISGkS3bAI2%2FnvMw5hfzsX7P073e%2FgY8TJbWBHk8l3skfggznCV2y5KDzk65NAulmnTEY%3D&OSSAccessKeyId=STS.NTVXXVha493eAkZWxMZfCbT26&Expires=1584330236&Signature=AxqHkB0Rs0DQQwRCBqERBf3elYc%3D

根据这些关键字网上搜索, 果然是阿里云的,

然后我再把这个链接粘贴到其他浏览器,

就跳到: https://public-download.csdn.net/500.html

<Error>
<Code>AccessDenied</Code>
<Message>You are denied by bucket referer policy.</Message>
<RequestId>5E6EF581AED6983436A3D8E1</RequestId>
<HostId>csdn-dl-public.oss-cn-beijing.aliyuncs.com</HostId>
<BucketName>csdn-dl-public</BucketName>
</Error>

阿里云oss没跑了。

最近编辑记录 超级萌新 (2020-03-16 11:49:26)

离线

#5 2020-03-16 11:59:15

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

Re: 用 php 测试 阿里云的 oss 对象存储云服务

@超级萌新 试了一下 csdn 下载, 还真是阿里云oss噢, 以前一直以为是csdn服务器自己存文件, 不明白为什么我把这个地址粘贴到别的浏览器就不能下载, 出现上面的 You are denied by bucket referer policy. 错误, 难道阿里云又跳转到 csdn 服务器校验是否登录?

离线

#6 2020-03-16 13:44:40

staunchheart
会员
注册时间: 2019-12-17
累计积分: 81

Re: 用 php 测试 阿里云的 oss 对象存储云服务

pythinker 说:

@超级萌新 试了一下 csdn 下载, 还真是阿里云oss噢, 以前一直以为是csdn服务器自己存文件, 不明白为什么我把这个地址粘贴到别的浏览器就不能下载, 出现上面的 You are denied by bucket referer policy. 错误, 难道阿里云又跳转到 csdn 服务器校验是否登录?

referer是最简单的防盗链,很容易伪造的。
看你安全的要求,referer是由浏览器,根据当前页面发送的,很容易摸拟。直接在浏览器中输入的地址referer是null.
如果在whycan中的某个页面引用,浏览器发送的 referer=whycan.com/
r安全要求高的话每一个下载链接都要通过时间戳生成密钥。

最近编辑记录 staunchheart (2020-03-16 13:47:20)

离线

#7 2020-03-16 14:18:38

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

Re: 用 php 测试 阿里云的 oss 对象存储云服务

staunchheart 说:

referer是最简单的防盗链,很容易伪造的。
看你安全的要求,referer是由浏览器,根据当前页面发送的,很容易摸拟。直接在浏览器中输入的地址referer是null.
如果在whycan中的某个页面引用,浏览器发送的 referer=whycan.com/
r安全要求高的话每一个下载链接都要通过时间戳生成密钥。

刚刚模拟了一下 http://download.csdn.net/ 的 referer,

还是用上面的下载链接,

出现了下面的错误: https://public-download.csdn.net/500.html

<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<RequestId>5E6F18CF6B3F22383545651F</RequestId>
<HostId>csdn-dl-public.oss-cn-beijing.aliyuncs.com</HostId>
<Key>500.html</Key>
</Error>

从这个错误The specified key does not exist.看来,

referer 只是第一道防线,后面还要验证 key,

我推测 csdn 为每个用户在 aliyun oss 申请了一个独立的 key。

现在我还没找到上面这步如何操作实现的,

如果这个能实现, 我觉得 aliyun oss 还是挺实用的。

离线

#8 2020-03-16 14:26:52

staunchheart
会员
注册时间: 2019-12-17
累计积分: 81

Re: 用 php 测试 阿里云的 oss 对象存储云服务

pythinker 说:

刚刚模拟了一下 http://download.csdn.net/ 的 referer,

还是用上面的下载链接,

出现了下面的错误: https://public-download.csdn.net/500.html

<Error>
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>
<RequestId>5E6F18CF6B3F22383545651F</RequestId>
<HostId>csdn-dl-public.oss-cn-beijing.aliyuncs.com</HostId>
<Key>500.html</Key>
</Error>

从这个错误The specified key does not exist.看来,

referer 只是第一道防线,后面还要验证 key,

我推测 csdn 为每个用户在 aliyun oss 申请了一个独立的 key。

现在我还没找到上面这步如何操作实现的,

如果这个能实现, 我觉得 aliyun oss 还是挺实用的。

如果是上面哪个地址,是带了签名和时间戳的。这带来一个问题,在百度搜索上也显示不了。所以做这个时要区分,需要SEO的与下载的分开。

离线

#9 2020-03-16 14:29:26

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

Re: 用 php 测试 阿里云的 oss 对象存储云服务

staunchheart 说:

如果是上面哪个地址,是带了签名和时间戳的。这带来一个问题,在百度搜索上也显示不了。所以做这个时要区分,需要SEO的与下载的分开。

感谢回复, 我现在不需要 SEO, 也不需要百度搜索到,只需要像csdn这样鉴权,

员工登录到公司网站才给这个地址 aliyun oss 地址,

否则即使得到这个地址也不给下载。

离线

#10 2020-03-16 14:54:14

pythinker
会员
注册时间: 2019-02-12
累计积分: 152

Re: 用 php 测试 阿里云的 oss 对象存储云服务

根据关键字security-token 搜到资料了:

https://help.aliyun.com/document_detail/100624.html

OSS可以通过阿里云STS(Security Token Service)进行临时授权访问。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。

离线

#11 2020-03-18 11:19:58

phpweb
会员
注册时间: 2020-02-05
累计积分: 68

Re: 用 php 测试 阿里云的 oss 对象存储云服务

刚关注了一下阿里云oss的售价,存储包 + 流量包

1T 标准存储包    一年  799元
1T/月下行流量包 一年 3636 元

--------------
一年算下来 799 + 3636 = 4435 元

这个价格比公司内部自己搭存储服务器更划算,
还能各种加密,异地容灾备份。

离线

#12 2020-03-25 14:47:18

phpweb
会员
注册时间: 2020-02-05
累计积分: 68

Re: 用 php 测试 阿里云的 oss 对象存储云服务

谢谢楼主, 测试代码可以用

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use OSS\OssClient;
use OSS\Core\OssException;

$accessKeyId = "你的key";
$accessKeySecret = "你的Secret";
$endpoint = "oss-cn-shanghai.aliyuncs.com";

try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
} catch (OssException $e) {
    print $e->getMessage();
}

//新建一个bucket(桶), 相当于文件夹, 所有的文件都存这里面,
//bucket名必须全局唯一,不能和自己的bucket name冲突, 也不能和别人的bucket name冲突。
$ossClient->createBucket('phpweb');

$bucket= "phpweb"; //刚刚建好的bucket
$object = "filename.txt";//文件名
$content = "Hello, OSS!"; //内容

try {
    //写文件
    $ossClient->putObject($bucket, $object, $content);
} catch (OssException $e) {
    print $e->getMessage();
}

//读文件内容
print_r($ossClient->getObject('whycan', "filename.txt"));

//删除 bucket
$ossClient->deleteBucket('phpweb');
?>

OssClient.php: https://github.com/aliyun/aliyun-oss-php-sdk/blob/master/src/OSS/OssClient.php

离线

页脚