我所做的是将文件签名放入数据库,放入文件类型的签名长度和扩展名。如果文件没有扩展名,则不会上传。如果文件扩展名已从签名更改,则例程将拒绝该文件。这是提取签名并进行比较的例程中的代码:
using var fileStream = file.OpenReadStream();
var signature = _context.FileSignatures.Select(f => new { f.FileSignature, f.AllowedFileType.FileExtension, f.SignatureLength })
.Where(x => x.FileExtension == fileType);
byte[] bytes = new byte[signature.Max(x => x.SignatureLength)];
fileStream.Read(bytes, 0, signature.Max(x => x.SignatureLength));
string hexData = BitConverter.ToString(bytes);
var foundFile = await signature.FirstAsync(x => x.FileSignature == hexData);
return foundFile.FileExtension;
文件签名存储在表中,如下所示:
File Extension FileSignature SignatureLength
.PDF 25-50-44-46 4
这样我可以确保读取签名的最大字节数并获取扩展名。如果我想包含更多文件,我只需将它们添加到数据库中。