签署API请求时要包含的内容

Noe*_*oel 2 c# authorization oauth

如果我有一个作为API请求发送的复杂对象(例如下面的Order),我应该在生成签名时包含所有属性还是仅使用一个子集?

我问,因为我不清楚,从查看其他API的请求参数是扁平和简单的

public class Order
    {
        public string Id { get; set; }
        public string ClientIdentifier { get; set; }
        public IEnumerable<OrderItems> OrderItems { get; set; }
        public long timestamp { get; set; }
        public string signature { get; set; }
    }

public class OrderItems
{
    public string ItemId { get; set; }
    public string Name { get; set; }
    public IEnumerable<decimal> PriceBands { get; set; }pes
            more types



}

and so on ....
Run Code Online (Sandbox Code Playgroud)

bwi*_*ght 7

首先,您需要了解消息的签名会阻止哪些数据应该包含在请求中.这是签署请求阻止攻击者能够做的两件主要事情的列表.

  1. 使用签名请求,密码将保持安全,攻击者无法使用查询中的信息签署其他请求.如果攻击者可以看到发送到服务器的请求,这将非常有用.
  2. 攻击者无法修改已用于生成签名的请求中的任何数据,而不会使签名无效,从而导致请求被服务器拒绝.

2号有一个问题.它仅有助于保护作为签名一部分的数据.如果您留下任何数据,攻击者可以更改该数据并发送与您发送的消息不同的消息.这就是在签署请求时需要包含所有请求数据的原因:完整URI包括域,标头,查询字符串参数以及任何发布的数据(如XML或JSON).