我想将aribtrary网址(包括路径和查询部分)转换为有效的文件名。我选择使用Base64
,如下所示。
是否有更好的Base64代码,例如避免Byte[]
? url到文件名的最佳做法是什么?我想有一个超出文件名长度限制的问题。
string encoded =
System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(url));
string decoded =
System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(encoded));
if (decoded != url)
throw(new SomeException());
答案 0 :(得分:2)
我想说最好的做法是,如果可能,文件名不应与URL直接相关。除非您控制将使用此方法调用的URL,否则您将面临安全隐患。最好是你可以生成一些本地ID,将其用作文件名,然后将该ID链接到URL。这样,您始终可以完全控制正在编写的文件名,而使用URL可以让您了解潜在的攻击者。
答案 1 :(得分:1)
如果/当您需要将名称翻译回原始Url时,您可能需要创建单独的映射表。生成一个唯一的文件名,并将其存储在表中,并在其旁边显示原始URL。您可以使用API(Guid,Random,DateTime)或简单的计数器来获取唯一的文件名。
这种方式不必担心重复和非法字符,因为您可以控制文件名生成。
当您缓存JSON请求/响应时,请小心使用POST:两个请求的URL可能相同,但内容可能不同,因此您可能不希望在下一个请求中使用第一个缓存。 / p>
一般情况下,您不会缓存POST,但有些REST API使用POST来绕过最大的Url GET请求长度。