HTTP文件上传边界选择

时间:2010-11-28 00:58:44

标签: c# http httpwebrequest http-headers boundary

所以我目前正在研究HTTP文件上传(在使用HttpWebRequest将一些文件上传到外部API的上下文中),通常我会看到几十个破折号被用作边界。浏览器似乎通常也会在破折号中添加随机选择的十六进制数字。

至少可以说这看起来非常笨拙(我敢说协议中存在缺陷吗?)。由于我的特定用例涉及的数据很可能包含我使用的边界(无论我选择什么;数据都是各种类型的转储)我需要100%确定我上传的文件不会破坏事物。即使实际碰撞的可能性是十亿分之一,随机选择一个数字对我来说根本不可接受。如果目标脚本检测到某些错误,则使用不同的随机选择边界重试,这不是我喜欢的。

对我来说,唯一的办法是避免这种情况扫描我的整个文件(通常是几兆字节)以查看我选择的边界是否不存在?我需要通过上传执行许多不同的请求,因此为了避免I / O损失,我希望避免扫描整个文件。

或者我是否可以通过某种尺寸参数,以便边界变得不仅仅是一种形式?

我错过了什么?无法更改远程API,因此无法在Base64中进行编码或添加某种转义字符。

4 个答案:

答案 0 :(得分:2)

我个人并不知道比扫描边界数据更快的方法。对于大多数应用程序,我相信他们是这样做的(下载Firefox的源代码并看看可能吗?)。

  1. 创建随机边界(理想情况下不太可能出现在数据中,例如-------- saDad8g3 --------)
  2. 搜索包含在其中的边界的数据
  3. 如果找到边界,请返回1.
  4. 我的猜测是,如果找到边界,代码会更改创建的随机边界并再次扫描。

    您可以通过将步骤3更改为:来优化此操作:如果找到边界,则在边界的末尾附加一个字节,该字节不是数据中的下一个字节,并继续搜索数据。

    如果确实认为您的应用程序具有如此高的性能要求,那么扫描上传内容是一个问题,我建议您使用此选项:

    1. 创建随机边界(再次,理想情况下不太可能出现在数据中)
    2. 不要检查您的数据是否出现(并且只是假设碰撞机会非常低)并上传。
    3. 如果您收到服务器错误,请返回步骤1,这将创建一个新的边界,希望在数据中不再尝试。
    4. 我的猜测是,最好在上传之前简单地扫描数据,而不是必须解决服务器的400错误是你的上传边界的错误,还是别的。

答案 1 :(得分:0)

为确保唯一性,请对边界字符串使用UUID / GUID,如以下所示的代码中所用:https://wqweto.wordpress.com/2011/07/12/vb6-using-wininet-to-post-binary-file/

在线GUID生成器:https://guidgenerator.com/online-guid-generator.aspx

答案 2 :(得分:0)

当使用所有70 characters作为随机字母数字边界和1GB数据时,碰撞的几率不是十亿分之一,而是十分之一的1分。由于流星撞击,你有更多的机会在下一个yoctosecond中失去你的左小拇指脚趾。如果这不能给你信心,我害怕什么都不会:)。请阅读我对几乎完全相同的问题的答案here

答案 3 :(得分:-1)

“我错过了什么?”

常识? :P

这是一种方法 - 读取你的文件上传,然后修改一个随机字节,瞧,你自己制作了一个边界,不会在文件中重复上传。但实际上,这是毫无意义的。例如,放入一个10k的边界会使碰撞的可能性变暗,直到发生字节冲突,人类更有可能消失。