Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么要检查上传的文件';s内容类型,如果发件人可以谎报内容类型?_C#_Api_Rest_.net 5_File Type - Fatal编程技术网

C# 为什么要检查上传的文件';s内容类型,如果发件人可以谎报内容类型?

C# 为什么要检查上传的文件';s内容类型,如果发件人可以谎报内容类型?,c#,api,rest,.net-5,file-type,C#,Api,Rest,.net 5,File Type,我正在编写一个隐藏在Azure API管理工具背后的API。除非APIM验证请求者的访问令牌以及Azure订阅,否则无法访问它。在API中,我们希望与请求者确认我们只接受zip文件 if (request.PayloadFile.ContentType != "application/zip") { throw new BadRequestException("Unable to accept payload content type"); }

我正在编写一个隐藏在Azure API管理工具背后的API。除非APIM验证请求者的访问令牌以及Azure订阅,否则无法访问它。在API中,我们希望与请求者确认我们只接受zip文件

if (request.PayloadFile.ContentType != "application/zip")
{
    throw new BadRequestException("Unable to accept payload content type");
}
这是而不是一个试图缓解不良行为的过程。其目的只是验证开发人员是否正在发送预期的数据类型。话虽如此,我制作了一个发送非zip格式文件的小客户端,我只需在请求中设置内容类型头:

var fileContent = new ByteArrayContent(await File.ReadAllBytesAsync(filePath));
fileContent.Headers.Remove("Content-Type");
fileContent.Headers.Add("Content-Type", "application/zip");
fileAsFormData.Add(fileContent, "payLoad", fileName: Path.GetFileName(filePath));
API欣然接受了这一点。所以我的问题有两个:

  • 我们为什么还要费心检查
    ContentType
    ,看它是否可以被欺骗
  • 有没有办法获得有效负载的真实文件类型

  • 内容类型是客户端向服务器指示要发送的内容的一种方式。当然,你可能会恶意地“撒谎”,但这会违背你作为客户的利益。服务器可能实现适当的逻辑来解析文件内容,具体取决于内容类型头

    有几件事需要考虑:

  • 只有在客户端发送有效数据的情况下,服务器才能正常工作:即:希望服务器正常工作的客户端不应该谎报上传文件的真实内容类型
  • 与使用其他方法指定文件类型相比,服务器更容易检查内容类型头
  • 服务器还应验证数据,并在可能滥用API的情况下降低风险。例如,在您的例子中,您应该在解压内容周围添加try-catch,如果解压不成功,则以错误响应
  • 对于您的另一个问题,即是否可以检查真正的内容类型,答案通常是:不可以。有一些文件类型,其中文件本身包含某种“神奇字符串”,可以用作该内容类型的符号

    您可以检查一些常见的文件符号:

    请注意,恶意用户也可以修改文件签名。可以采取额外的安全措施来防止欺骗文件内容,例如校验和,但没有100%的安全性,除非服务器和受信任的客户端之间共享一些私人秘密,这些秘密可用于安全地对内容进行签名


    这里真正的问题是:为什么会有人恶意欺骗内容类型?还是文件内容?以及需要何种级别的安全措施来避免相关风险?

    内容类型是客户端向服务器指示希望发送的内容的一种方式。当然,你可能会恶意地“撒谎”,但这会违背你作为客户的利益。服务器可能实现适当的逻辑来解析文件内容,具体取决于内容类型头

    有几件事需要考虑:

  • 只有在客户端发送有效数据的情况下,服务器才能正常工作:即:希望服务器正常工作的客户端不应该谎报上传文件的真实内容类型
  • 与使用其他方法指定文件类型相比,服务器更容易检查内容类型头
  • 服务器还应验证数据,并在可能滥用API的情况下降低风险。例如,在您的例子中,您应该在解压内容周围添加try-catch,如果解压不成功,则以错误响应
  • 对于您的另一个问题,即是否可以检查真正的内容类型,答案通常是:不可以。有一些文件类型,其中文件本身包含某种“神奇字符串”,可以用作该内容类型的符号

    您可以检查一些常见的文件符号:

    请注意,恶意用户也可以修改文件签名。可以采取额外的安全措施来防止欺骗文件内容,例如校验和,但没有100%的安全性,除非服务器和受信任的客户端之间共享一些私人秘密,这些秘密可用于安全地对内容进行签名


    这里真正的问题是:为什么会有人恶意欺骗内容类型?还是文件内容?需要什么级别的安全措施来避免相关风险?

    我首先想到的是,它可以防止善意用户意外上传错误的文件类型。zip文件格式在第一个字节中有一个神奇的数字,你可以检查一下,但它本身并不能保证这是一个有效的zip。我首先想到的是,它可以防止善意的用户意外上传错误的文件类型。zip文件格式在第一个字节中有一个神奇的数字,您可以检查它,但它本身不能保证这是一个有效的zip。