所以我目前正在研究HTTP文件上传(在使用HttpWebRequest
将一些文件上传到外部API的上下文中),通常我会看到几十个破折号被用作边界。浏览器似乎通常也会在破折号中添加随机选择的十六进制数字。
至少可以说这看起来非常笨拙(我敢说协议中存在缺陷吗?)。由于我的特定用例涉及的数据很可能包含我使用的边界(无论我选择什么;数据都是各种类型的转储)我需要100%确定我上传的文件不会破坏事物。即使实际碰撞的可能性是十亿分之一,随机选择一个数字对我来说根本不可接受。如果目标脚本检测到某些错误,则使用不同的随机选择边界重试,这不是我喜欢的。
对我来说,唯一的办法是避免这种情况扫描我的整个文件(通常是几兆字节)以查看我选择的边界是否不存在?我需要通过上传执行许多不同的请求,因此为了避免I / O损失,我希望避免扫描整个文件。
或者我是否可以通过某种尺寸参数,以便边界变得不仅仅是一种形式?
我错过了什么?无法更改远程API,因此无法在Base64中进行编码或添加某种转义字符。
答案 0 :(得分:2)
我个人并不知道比扫描边界数据更快的方法。对于大多数应用程序,我相信他们是这样做的(下载Firefox的源代码并看看可能吗?)。
我的猜测是,如果找到边界,代码会更改创建的随机边界并再次扫描。
您可以通过将步骤3更改为:来优化此操作:如果找到边界,则在边界的末尾附加一个字节,该字节不是数据中的下一个字节,并继续搜索数据。
如果确实认为您的应用程序具有如此高的性能要求,那么扫描上传内容是一个问题,我建议您使用此选项:
我的猜测是,最好在上传之前简单地扫描数据,而不是必须解决服务器的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的边界会使碰撞的可能性变暗,直到发生字节冲突,人类更有可能消失。