如何在Java中验证档案并识别无效的文档

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

在我们当前的网络安全格局中,狡猾的自定义内容威胁开始以更高的频率穿越我们的电子邮件安全策略以及防火墙/病毒扫描网络代理。巧妙伪装的文件可以轻易地进入我们的收件箱和我们最敏感的文件存储位置,并且它们可以在那里潜伏很长时间,耐心地等待毫无戒心的受害者下载并执行其恶意载荷。

看似,我们越快地努力理解和减轻一种隐藏内容的威胁,这种威胁就越快地演变成完全新的东西,一次又一次地令我们措手不及。

近年来,Office文件格式、URL和可执行文件已成为最常见的针对潜在的电子邮件和存储为基础的攻击载体的主机。在我们的电子邮件收件箱中经常遇到指向被泄露网站的链接,恶意宏和各种可执行文件也是如此。无效的文件、受密码保护的文件,甚至是带有恶意内容的启用OLE(对象链接和嵌入)的文件,经常可以在我们的云存储实例中随处发现。

在所有这些中,一个更加隐秘的恶意软件主机形式开始在其同代中获得更多的地位,即ZIP和RAR等档案文件格式。根据2022年三个月内的研究,超过40%的恶意软件攻击使用ZIP和RAR格式将恶意内容传输到客户端设备上。这超过了同一时期许多早已建立的Office格式的使用量,虽然这初看起来可能令人惊讶,但仔细一看,原因就不难理解了。文件压缩格式可以利用强大的加密算法来保护其内容,而当常规的病毒和恶意软件扫描服务不能解密它需要扫描的文件时,它能做的事情就不多了。

如果说档案的加密算法已经为病毒和恶意软件扫描解决方案带来了足够的障碍,那么使事情变得更加困难的是这些档案格式可以轻易地通过伪装的无效文件类型的正文被走私过安全策略。例如,一些最近的攻击已经在HTML文档中隐藏了档案,这些HTML文档被设计得能够令人信服地模仿我们经常在浏览器上打开的在线PDF查看器(带有明显的PDF文件扩展名和看似正常的文档缩略图)。如果我们让我们的眼睛欺骗我们并下载一个HTML模仿文件,我们可能会在不知情的情况下解密并随后将一个外部存储的恶意ZIP或RAR档案的内容直接注入到我们的设备上,从而允许攻击者与我们的计算机建立直接连接并启动一个完全成熟的网络攻击。

纯粹的病毒和恶意软件检测政策成为他们自己的不足够的哨兵,对入站文件同时部署内容验证为中心的政策变得比以往任何时候都更加重要。在敏感位置检测到一个偏离的ZIP、RAR或无效文件类型可能是一个潜在网络攻击成功与失败的区别。我们可以使用简单的文档验证API来实现这一目标,我在这篇文章的演示部分提供了一些免费使用的选项。

演示 

以下提供的API解决方案是免费使用的(带有免费的API密钥),并且它们可以通过在页面下方提供的即用型Java代码示例轻松调用,首先从Java SDK安装说明开始。它们被设计为执行以下操作:

  • 验证文件是否为ZIP档案。 

  • 验证文件是否为RAR档案。 

  • 自动检测常见文件类型(即PDF、HTML、XLSX等)的内容,并针对文件的扩展名进行深入的内容验证。 

处理每个文件后,这些解决方案将返回一个“DocumentIsValid”布尔响应,使得在我们的系统内的敏感位置旁边标记或转移常见的内容威胁类型变得简单。此外,所有这些解决方案都将确定文件是否有密码保护措施(这通常是恶意内容的进一步指示——尤其是当有疑问的文件来自不值得信赖的来源时),并且它们将识别与有疑问的文档相关的任何明显的错误或警告。

提醒一下,这些 API 并非旨在检测或标记病毒或恶意软件签名;而是用于检测或标记病毒或恶意软件签名。它们的效用取决于您选择部署它们的位置。它们可以像任何常规文件处理应用程序的工作流程中的简单数据验证步骤一样轻松部署。在页面的下方,我链接了一篇上一篇文章,其中重点介绍了一个 API 解决方案,该解决方案可以一步扫描、验证和验证内容。

要开始构建我们的 API 调用,我们首先在 pom.xml 中添加对存储库的引用,然后使用Maven安装 SDK:

            jitpack.io        https://jitpack.io    

之后,让我们在 pom.xml 中添加对依赖项的引用:

    com.github.Cloudmersive    Cloudmersive.APIClient.Java    v4.25

然后我们可以使用以下代码调用 ZIP 文件验证 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.validateDocumentZipValidation(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ValidateDocumentApi#validateDocumentZipValidation");
    e.printStackTrace();
}

我们可以使用以下代码调用 RAR 文件验证 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.validateDocumentRarValidation(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ValidateDocumentApi#validateDocumentRarValidation");
    e.printStackTrace();
}

最后,我们可以使用下面的最终代码示例调用自动内容验证 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 {
    AutodetectDocumentValidationResult result = apiInstance.validateDocumentAutodetectValidation(inputFile);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ValidateDocumentApi#validateDocumentAutodetectValidation");
    e.printStackTrace();
}

希望通过实施一些额外的内容验证策略,我们可以放心,我们会意识到常见威胁媒介何时进入我们的系统。

一次性扫描、验证和确认内容

要利用旨在同时识别病毒、恶意软件和自定义内容威胁(具有完整内容验证和自定义内容限制策略)的 API 解决方案,请随时查看我的上一篇文章“如何保护 .NET Web 应用程序免受病毒侵害”和零日威胁。”

由于该文章适用于.NET应用程序开发,因此我在下面提供了用于 Java 应用程序开发的类似Java代码示例。

首先,在 pom.xml 中添加对存储库的以下引用:

            jitpack.io        https://jitpack.io    

然后在 pom.xml 中添加以下对依赖项的引用:

    com.github.Cloudmersive    Cloudmersive.APIClient.Java    v4.25

最后,请使用以下Java代码示例来结构化您的API调用,并再次使用免费层次的API密钥来授权您的请求。如链接文章中所述,您可以使用布尔值来针对各种自定义内容威胁类型(宏、密码保护的文件、恶意档案、HTML、脚本等)设置自定义限制,并且您可以通过在字符串restrictFileTypes参数中提供一个以逗号分隔的接受的文件扩展名列表(例如.docx、.pdf、.xlsx)来自定义限制不需要的文件类型。

// 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.
Boolean allowExecutables = true; // Boolean | Set to false to block executable files (program code) from being allowed in the input file.  Default is false (recommended).
Boolean allowInvalidFiles = true; // Boolean | Set to false to block invalid files, such as a PDF file that is not really a valid PDF file, or a Word Document that is not a valid Word Document.  Default is false (recommended).
Boolean allowScripts = true; // Boolean | Set to false to block script files, such as a PHP files, Python scripts, and other malicious content or security threats that can be embedded in the file.  Set to true to allow these file types.  Default is false (recommended).
Boolean allowPasswordProtectedFiles = true; // Boolean | Set to false to block password protected and encrypted files, such as encrypted zip and rar files, and other files that seek to circumvent scanning through passwords.  Set to true to allow these file types.  Default is false (recommended).
Boolean allowMacros = true; // Boolean | Set to false to block macros and other threats embedded in document files, such as Word, Excel and PowerPoint embedded Macros, and other files that contain embedded content threats.  Set to true to allow these file types.  Default is false (recommended).
Boolean allowXmlExternalEntities = true; // Boolean | Set to false to block XML External Entities and other threats embedded in XML files, and other files that contain embedded content threats.  Set to true to allow these file types.  Default is false (recommended).
Boolean allowInsecureDeserialization = true; // Boolean | Set to false to block Insecure Deserialization and other threats embedded in JSON and other object serialization files, and other files that contain embedded content threats.  Set to true to allow these file types.  Default is false (recommended).
Boolean allowHtml = true; // Boolean | Set to false to block HTML input in the top level file; HTML can contain XSS, scripts, local file accesses and other threats.  Set to true to allow these file types.  Default is false (recommended) [for API keys created prior to the release of this feature default is true for backward compatability].
String restrictFileTypes = "restrictFileTypes_example"; // String | Specify a restricted set of file formats to allow as clean as a comma-separated list of file formats, such as .pdf,.docx,.png would allow only PDF, PNG and Word document files.  All files must pass content verification against this list of file formats, if they do not, then the result will be returned as CleanResult=false.  Set restrictFileTypes parameter to null or empty string to disable; default is disabled.
try {
    VirusScanAdvancedResult result = apiInstance.scanFileAdvanced(inputFile, allowExecutables, allowInvalidFiles, allowScripts, allowPasswordProtectedFiles, allowMacros, allowXmlExternalEntities, allowInsecureDeserialization, allowHtml, restrictFileTypes);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling ScanApi#scanFileAdvanced");
    e.printStackTrace();
}

作者:Brian O'Neill

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

你可能感兴趣的:(技术专栏,java,开发语言,html)