This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
formpost 用于验证文件上传的签名也应被认为是有效的,如果用于计算签名的 object_prefix 是表单的 action url 中使用的 object_prefix 的真实子前缀。 这样,通过基于 Web 的应用程序与外部人员共享数据将变得更加容易,因为只需要一个签名就可以为容器中的每个伪文件夹创建表单。
目前,如果想要使用表单上传数据,表单的签名必须使用与表单的 action 属性的 url 中的 object_prefix 相同的 object_prefix 进行计算。 我们建议允许动态创建的表单,这些表单对包含公共前缀的所有 object_prefix 都有效。
这样,就可以生成一个对容器中的所有伪文件夹都有效的签名。 该签名可以在 Web 应用程序中使用,以便与外部人员共享容器的每个可能的伪文件夹。 希望共享其容器的用户不必为每个伪文件夹生成签名。
formpost 中间件应进行更改。 代码更改将非常小。 如果需要基于子前缀的签名,签名的 hmac_body 必须包含一个“subprefix”字段,以确保签名创建者明确允许将对象上传到子伪文件夹中。 除此之外,表单还必须包含一个隐藏字段“subprefix”。 Formpost 将使用该字段的值来基于该值计算哈希值。 此外,中间件将检查对象路径是否确实包含此前缀。
举个例子:用户希望以基于 Web 的方式与外部用户共享伪文件夹“folder”。 他(或 Web 应用程序)使用路径“/v1/my_account/container/folder”和 subprefix “folder” 计算签名
import hmac
from hashlib import sha1
from time import time
path = '/v1/my_account/container/folder'
redirect = 'https://myserver.com/some-page'
max_file_size = 104857600
max_file_count = 10
expires = int(time() + 600)
key = 'MYKEY'
hmac_body = '%s\n%s\n%s\n%s\n%s\n%s' % (path, redirect,
max_file_size, max_file_count, expires, "folder")
signature = hmac.new(key, hmac_body, sha1).hexdigest()
如果外部用户希望发布到子文件夹 folder/subfolder/,将使用包含上述计算的签名和隐藏字段 subprefix 的表单
<![CDATA[
<form action="https://myswift/v1/my_account_container/folder/subfolder/"
method="POST"
enctype="multipart/form-data">
<input type="hidden" name="redirect" value="REDIRECT_URL"/>
<input type="hidden" name="max_file_size" value="BYTES"/>
<input type="hidden" name="max_file_count" value="COUNT"/>
<input type="hidden" name="expires" value="UNIX_TIMESTAMP"/>
<input type="hidden" name="signature" value="HMAC"/>
<input type="hidden" name="subprefix" value="folder"
<input type="file" name="FILE_NAME"/>
<br/>
<input type="submit"/>
</form>
]]>
添加对 formpost 和相应测试模块的修改。
无
无
无
修改 formpost 中间件的文档。
无
应将测试添加到现有的测试模块。
无