该 TarReader 类现在在读取过程中验证 TAR 存档条目的校验和。 如果条目的校验和无效, TarReader 则引发一个 InvalidDataException。 此更改通过确保在处理过程中检测到损坏或篡改的 TAR 文件并对其进行标记,从而提高数据完整性。
已引入的版本
.NET 11 预览版 1
以前的行为
以前,读取具有无效校验和的 TAR 存档时, TarReader 忽略了校验和不匹配,并继续处理存档而不引发异常。
示例代码:
using System.Formats.Tar;
using System.IO;
using var stream = File.OpenRead("bad-cksum.tar");
using var reader = new TarReader(stream);
while (reader.GetNextEntry() is not null)
{
// Process entries, even if the checksum is invalid.
}
如果 TAR 文件 bad-cksum.tar 包含具有无效校验和的条目,则代码将处理该条目而不指示问题。
新行为
从 .NET 11 开始,读取具有无效校验和的 TAR 存档时, TarReader 会引发 InvalidDataException 并停止处理存档。 异常消息指示校验和验证失败。
破坏性变更的类型
此更改为行为更改。
更改原因
引入了此更改以提高库的可靠性和安全性 System.Formats.Tar 。 通过验证校验和, TarReader 可以检测和防止使用损坏或篡改的 TAR 文件,确保只处理有效的数据。 有关详细信息,请参阅 dotnet/runtime#118577 和 dotnet/runtime#117455。
建议的措施
如果应用程序依赖于 TarReader 处理 TAR 存档:
- 更新代码以处理校验和验证失败时可能抛出的异常InvalidDataException。
- 确保正在处理的 TAR 文件有效且具有正确的校验和。 如果遇到校验和失败,请验证源 TAR 文件的完整性。
- 如果需要针对特定方案处理具有无效校验和的 TAR 文件,请考虑实现自定义错误处理或预处理文件以更正校验和。
更新的示例:
using System.Formats.Tar;
using System.IO;
try
{
using var stream = File.OpenRead("archive.tar");
using var reader = new TarReader(stream);
while (reader.GetNextEntry() is not null)
{
// Process entries.
}
}
catch (InvalidDataException ex)
{
Console.WriteLine($"Error reading TAR archive: {ex.Message}");
// Handle invalid checksum scenario.
}