Skip to content

Commit 32c5c08

Browse files
committed
Host 参与签名计算
1 parent 1eb19cc commit 32c5c08

File tree

4 files changed

+56
-4
lines changed

4 files changed

+56
-4
lines changed

index.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ declare namespace COS {
196196
SecretId: string,
197197
/** 计算签名用的密钥 SecretKey,必选 */
198198
SecretKey: string,
199+
/** 请求的存储桶,如果传入了 Bucket、Region,签名会默认加上 Host 字段,可选 */
200+
Bucket?: Bucket,
201+
/** 请求的地域,如果传入了 Bucket、Region,签名会默认加上 Host 字段,可选 */
202+
Region?: Region,
199203
/** 请求方法,可选 */
200204
Method?: Method,
201205
/** 请求路径,最前面带 /,例如 /images/1.jpg,可选 */
@@ -1877,6 +1881,10 @@ Bulk:批量模式,恢复时间为24 - 48小时。 */
18771881
SecretId?: string,
18781882
/** 计算签名用的密钥 SecretKey,如果不传会用实例本身的凭证,可选 */
18791883
SecretKey?: string,
1884+
/** 请求的存储桶,如果传入了 Bucket、Region,签名会默认加上 Host 字段,可选 */
1885+
Bucket?: Bucket,
1886+
/** 请求的地域,如果传入了 Bucket、Region,签名会默认加上 Host 字段,可选 */
1887+
Region?: Region,
18801888
/** 请求方法 */
18811889
Method?: Method,
18821890
/** 请求的对象键,最前面不带 /,例如 images/1.jpg */

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cos-nodejs-sdk-v5",
3-
"version": "2.9.21",
3+
"version": "2.10.0",
44
"description": "cos nodejs sdk v5",
55
"main": "index.js",
66
"types": "index.d.ts",

sdk/base.js

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,17 @@ function getService(params, callback) {
3939
domain = protocol + '//service.cos.myqcloud.com';
4040
}
4141

42+
var SignHost = '';
43+
var standardHost = region ? 'cos.' + region + '.myqcloud.com' : 'service.cos.myqcloud.com';
44+
var urlHost = domain.replace(/^https?:\/\/([^/]+)(\/.*)?$/, '$1');
45+
if (standardHost === urlHost) SignHost = standardHost;
46+
4247
submitRequest.call(this, {
4348
Action: 'name/cos:GetService',
4449
url: domain,
4550
method: 'GET',
4651
headers: params.Headers,
52+
SignHost: SignHost,
4753
}, function (err, data) {
4854
if (err) return callback(err);
4955
var buckets = (data && data.ListAllMyBucketsResult && data.ListAllMyBucketsResult.Buckets
@@ -3022,6 +3028,8 @@ function getAuth(params) {
30223028
return util.getAuth({
30233029
SecretId: params.SecretId || this.options.SecretId || '',
30243030
SecretKey: params.SecretKey || this.options.SecretKey || '',
3031+
Bucket: params.Bucket,
3032+
Region: params.Region,
30253033
Method: params.Method,
30263034
Key: params.Key,
30273035
Query: params.Query,
@@ -3067,19 +3075,27 @@ function getObjectUrl(params, callback) {
30673075

30683076
var queryParamsStr = '';
30693077
if(params.Query){
3070-
queryParamsStr += util.obj2str(params.Query);
3078+
queryParamsStr += util.obj2str(params.Query);
30713079
}
30723080
if(params.QueryString){
3073-
queryParamsStr += (queryParamsStr ? '&' : '') + params.QueryString;
3081+
queryParamsStr += (queryParamsStr ? '&' : '') + params.QueryString;
30743082
}
30753083

3084+
// 签名加上 Host,避免跨桶访问
3085+
var SignHost = '';
3086+
var standardHost = 'cos.' + params.Region + '.myqcloud.com';
3087+
if (!self.options.ForcePathStyle) standardHost = params.Bucket + '.' + standardHost;
3088+
var urlHost = url.replace(/^https?:\/\/([^/]+)(\/.*)?$/, '$1');
3089+
if (standardHost === urlHost) SignHost = standardHost;
3090+
30763091
var syncUrl = url;
30773092
if (params.Sign !== undefined && !params.Sign) {
30783093
queryParamsStr && (syncUrl += '?' + queryParamsStr);
30793094
callback(null, {Url: syncUrl});
30803095
return syncUrl;
30813096
}
30823097

3098+
var SignHost = getSignHost.call(this, {Bucket: params.Bucket, Region: params.Region, Url: url});
30833099
var AuthData = getAuthorizationAsync.call(this, {
30843100
Action: ((params.Method || '').toUpperCase() === 'PUT' ? 'name/cos:PutObject' : 'name/cos:GetObject'),
30853101
Bucket: params.Bucket || '',
@@ -3088,7 +3104,8 @@ function getObjectUrl(params, callback) {
30883104
Key: params.Key,
30893105
Expires: params.Expires,
30903106
Headers: params.Headers,
3091-
Query: params.Query
3107+
Query: params.Query,
3108+
SignHost: SignHost,
30923109
}, function (err, AuthData) {
30933110
if (!callback) return;
30943111
if (err) {
@@ -3234,14 +3251,36 @@ function getUrl(params) {
32343251
return url;
32353252
}
32363253

3254+
var getSignHost = function (opt) {
3255+
if (!opt.Bucket || !opt.Bucket) return '';
3256+
var ps = this.options.ForcePathStyle;
3257+
var url = opt.Url || getUrl({
3258+
ForcePathStyle: ps,
3259+
protocol: this.options.Protocol,
3260+
domain: this.options.Domain,
3261+
bucket: opt.Bucket,
3262+
region: opt.Region,
3263+
});
3264+
var standardHost = (ps ? '' : opt.Bucket + '.') + 'cos.' + opt.Region + '.myqcloud.com';
3265+
var urlHost = url.replace(/^https?:\/\/([^/]+)(\/.*)?$/, '$1');
3266+
if (standardHost === urlHost) return standardHost;
3267+
return '';
3268+
}
3269+
32373270
// 异步获取签名
32383271
function getAuthorizationAsync(params, callback) {
32393272

32403273
var headers = util.clone(params.Headers);
3274+
var headerHost = '';
32413275
util.each(headers, function (v, k) {
32423276
(v === '' || ['content-type', 'cache-control', 'expires'].indexOf(k.toLowerCase()) > -1) && delete headers[k];
3277+
if (k.toLowerCase() === 'host') headerHost = v;
32433278
});
32443279

3280+
// Host 加入签名计算
3281+
if (!headerHost && params.SignHost) headers.Host = params.SignHost;
3282+
3283+
32453284
// 获取凭证的回调,避免用户 callback 多次
32463285
var cbDone = false;
32473286
var cb = function (err, AuthData) {
@@ -3479,6 +3518,7 @@ function submitRequest(params, callback) {
34793518
var Query = util.clone(params.qs);
34803519
params.action && (Query[params.action] = '');
34813520

3521+
var SignHost = params.SignHost || getSignHost.call(this, {Bucket: params.Bucket, Region: params.Region});
34823522
var next = function (tryTimes) {
34833523
var oldClockOffset = self.options.SystemClockOffset;
34843524
getAuthorizationAsync.call(self, {
@@ -3488,6 +3528,7 @@ function submitRequest(params, callback) {
34883528
Key: params.Key,
34893529
Query: Query,
34903530
Headers: params.headers,
3531+
SignHost: SignHost,
34913532
Action: params.Action,
34923533
ResourceKey: params.ResourceKey,
34933534
Scope: params.Scope,

sdk/util.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ var getAuth = function (opt) {
6363
pathname.indexOf('/') !== 0 && (pathname = '/' + pathname);
6464
}
6565

66+
// 如果有传入存储桶,那么签名默认加 Host 参与计算,避免跨桶访问
67+
if (!headers.Host && !headers.host && opt.Bucket && opt.Region) headers.Host = opt.Bucket + '.cos.' + opt.Region + '.myqcloud.com';
68+
6669
if (!SecretId) throw new Error('missing param SecretId');
6770
if (!SecretKey) throw new Error('missing param SecretKey');
6871

0 commit comments

Comments
 (0)