如何停止HTML表单提交中的百分比编码

如何停止HTML表单提交中的百分比编码,html,forms,amazon-web-services,get,Html,Forms,Amazon Web Services,Get,我试图让我的网站的用户能够从AmazonS3下载文件。URL由Web服务器上的AWS私钥进行数字签名,然后通过AJAX发送到客户端,并嵌入到html表单的action属性中 提交表单时会出现问题。表单的action属性包含具有数字签名的url。此签名通常包含+符号,这些符号的编码百分比为。它完全使签名无效。如何防止表单对URL进行百分比编码?我(恭敬地)建议您需要更仔细地确定问题的确切性质,在流程中它在哪里发生故障,并准确地确定您实际需要解决的问题。URL对“+”的编码对于浏览器来说是正确的,因

我试图让我的网站的用户能够从AmazonS3下载文件。URL由Web服务器上的AWS私钥进行数字签名,然后通过AJAX发送到客户端,并嵌入到html表单的action属性中

提交表单时会出现问题。表单的action属性包含具有数字签名的url。此签名通常包含
+
符号,这些符号的编码百分比为。它完全使签名无效。如何防止表单对URL进行百分比编码?

我(恭敬地)建议您需要更仔细地确定问题的确切性质,在流程中它在哪里发生故障,并准确地确定您实际需要解决的问题。URL对“+”的编码对于浏览器来说是正确的,因为查询字符串中的文本“+”被服务器正确解释为“”(空格)

您的问题促使我回顾了我编写的代码,该代码为S3生成签名URL,我的记忆是正确的——我正在将签名中的“+”更改为%2B,“=”更改为%3D,“/”更改为%2F。。。所以这不是无效的。这是假设我们谈论的是同一件事,你在问题中提到的“数字签名”就是这里讨论的签名:

注意,示例中的签名中有一个URL编码的“+”:signature=vjbyPxybdZaNmGa%2byt272yeav4%3D


我将推测您遇到的问题可能不是“+”→ '%2B'(不仅有效,而且是必需的)。。。但也许这是一种双重编码,在某种程度上,你是双重编码的,所以“+”→ '%2B'→ '%252B'。。。百分比符号被编码为文字,这将破坏签名。

您可以使用缩短的URLservice@Guy:这将如何防止URL被百分比编码?如果我能通过屏幕与你握手,我会的。让我首先说,这很奇怪,因为当签名不包含保留字符(如“+”等)时,URL会工作。“=”字符是保留的,但我手动附加了一个“%3D”(不知道如何对base64编码字符串进行URL编码)。因此,上传将有50%的时间有效。我现在所做的是在URL的签名部分用javascript调用incodeuricomponent()',一切都与您前面所说的一模一样。如果可以的话,我会给你+2。现在,让下载正常工作是一个完全不同的故事。AJAX上传二进制数据非常好。很遗憾,我们无法通过AJAX下载保存文件。我正在将临时URL附加到表单。我想知道您是否有过发送临时下载URL的经验,这些URL会附加到表单中,然后由用户提交。我想问也无妨;)这是一个独立的问题,但我通过重定向将授权用户发送到受保护的S3下载。用户实际单击的链接指向我的服务器,在验证该特定用户的下载授权后(因为它是返回给我的链接,cookies都在那里),该服务器返回一个“302-Found”重定向响应,在“Location:”标题中有一个快速过期的签名S3 URL,这会导致浏览器从S3获取文件,但不会在下次记住重定向,因为重定向将已过期。另外,请注意,您不希望恶意用户使用这样的机制来发现有关您系统的任何信息,因此,为了不显示我的卡,我的系统使用404响应任何未经授权、无效或意外的请求,并在返回错误之前验证您的会话和执行其他“技术上不必要的”操作,因此没有机会区分“它确实不在这里”和“不允许您看到它”基于测量服务器响应时间的差异,我认为我采取的安全措施是用户必须登录并拥有信用卡才能上传/下载任何内容。只有当您有有效会话时,才会发送URL。我喜欢你重定向用户的想法,我唯一关心的是从服务器到客户端的数据流。我正在处理的文件可能很大,这可能成为一个重要的瓶颈。我宁愿让他们直接从亚马逊下载。从HTML表单下载文件的问题是,您无法访问发送的标题,因此签名不匹配。AJAX不是一个选项。