如何在 Java 中扫描和验证图像上传

直接图像上传过程在客户端用户和网站的底层文件存储实例之间创建了一条高效的路径,极大地有利于客户端/Web 服务关系的两端。很大程度上,由于独立开发者项目和小型企业的云存储资源的可用性(和可负担性)不断提高,我们看到越来越频繁地上传我们自己的图像文件的选项,无论我们在网上查看什么,随着对新形式的社交参与和商业的稳定需求而增长。

然而,问题在于文件上传安全性是一个非常严重的问题 - 图像文件很容易被客户端威胁行为者利用。当然,图像文件在这方面并不是独一无二的(例如,许多常见的文件格式,包括 PDF、DOCX 等,可以容纳各种隐藏的威胁),但它们在互联网上的巨大价值——一个主要是视觉平台——使它们成为恶意内容的更方便的容器之一。

攻击者可以使用经过磨练的隐写技术轻松地将恶意软件和其他恶意代码直接注入图像文件,从而可靠地避免从配置不当的上传安全策略中检测到。恶意软件可以以多种不同的方式隐藏在图像文件中——直截了当地附加到文件末尾,通过微小的代码更改巧妙地合并,甚至隐藏在图像的元数据或 EXIF 数据中。恶意代码通常设计为远程执行或在文件打开时执行,这意味着存储中休眠的、未被发现的威胁可能会等待数天、数周甚至数月,然后才会突然释放危险内容。他们不仅可以利用网站的系统:如果毫无戒心的客户端用户下载受感染的文件,他们的设备可能会很快受到损害,严重(可能是永久性)损害网站的声誉。

缓解图像文件上传威胁首先要实施强大的病毒和恶意软件检测策略,还涉及采取合理的文件上传验证措施。例如,异常大的图像文件可能表示存在隐藏的威胁,因此了解(并可能标准化)图像上传的大小有助于更快地检测威胁。此外,限制允许上传的不同文件扩展名的数量(例如,限制为 PNG 或 JPG)使文件扩展名验证更容易、更高效地执行。也不应盲目信任文件扩展名和标头 - 彻底的内容验证应始终考虑文件结构和文件编码。

示范
在本文的其余部分,我将演示两种简单易用的解决方案,它们可以帮助病毒扫描和验证图像文件上传,然后再到达云存储。两者都可以有效地利用,使用互补的、即用型的 Java 代码示例来构建您的 API 调用。这些 API 分别执行以下功能:

扫描图像文件中的病毒
验证图像文件
这两个 API 相互结合使用,可以帮助确保图像上传有效且没有病毒和恶意软件,从而显着降低与直接上传图像文件相关的风险。

扫描图像文件以查找病毒
该 API 配备了超过 1700 万个病毒和恶意软件签名,涵盖了特洛伊木马、勒索软件和间谍软件等极其常见的威胁。它也不仅限于图像文件(您还可以扫描 PDF、DOCX、XLSX 等文档),因此如果您的文件上传过程接受多种文件类型,它会提供一些多功能性。所有扫描的文件最终都将收到“CleanResult: True”或“CleanResult: False”布尔响应;如果为 false,则将在 API 响应中提供检测到的病毒的名称。

若要安装客户端 SDK,首先,在 Maven POM 文件中添加对存储库的引用。Jitpack 用于动态编译库:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

之后,添加对依赖项的引用:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

安装完成后,您可以使用以下补充代码示例构建 API 调用:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ScanApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ScanApi apiInstance = new ScanApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
try {
    VirusScanResult result = apiInstance.scanFile(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ScanApi#scanFile");
    e.printStackTrace();
}

在测试此解决方案时,我建议彻底研究可以安全地触发“CleanResult:False”响应的惰性文件选项(例如,Eicar 文件通常是这方面的热门选择)。

验证图像文件
此 API 旨在严格验证数十种常见的输入图像类型,包括 JPG、PNG、WEBP、GIF 等等。它将确定图像上传中包含的内容是否与其扩展名匹配,文件是否受密码保护,以及文件中是否存在任何错误和警告。如果检测到任何错误,API 响应将提供错误描述、错误路径和 URI 以供参考。

您可以像以前一样安装此客户端 SDK。将此引用添加到 Maven POM 文件存储库:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

然后添加对依赖项的引用:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

最后,您可以使用以下即用型代码示例来构建 API 调用:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ValidateDocumentApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

ValidateDocumentApi apiInstance = new ValidateDocumentApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
try {
    DocumentValidationResult result = apiInstance.validateDocumentImageValidation(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ValidateDocumentApi#validateDocumentImageValidation");
    e.printStackTrace();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值