如何在Java中掃描和驗證圖像上傳
譯文譯者 | 李睿
審校 | 重樓
直接上傳圖像文件的過程在客戶端用戶和網(wǎng)站的底層文件存儲實例之間創(chuàng)建了一條高效的路徑,極大地有利于客戶端/web服務(wù)關(guān)系的兩端。在很大程度上,由于獨立開發(fā)者項目和小型企業(yè)的云存儲資源的可用性(以及可負擔性)不斷提高,人們越來越頻繁地上傳自己的圖像文件,無論在哪里上網(wǎng),這與對新形式的社會參與和商業(yè)的穩(wěn)定需求同步增長。
然而,文件上傳安全性如今成為一個非常嚴重的問題,而且圖像文件很容易被客戶端威脅行為者利用。當然,圖像文件在這方面并不是唯一的(例如,包括PDF、DOCX等在內(nèi)的許多常見文件格式,可以容納各種隱藏的威脅),但它們在互聯(lián)網(wǎng)上的巨大價值(一個主要的視覺平臺)使它們成為惡意內(nèi)容的更便利的載體之一。
網(wǎng)絡(luò)攻擊者可以將惡意軟件和其他惡意代碼直接注入圖像文件,從而避免被配置不佳的上傳安全策略檢測到。惡意軟件能夠以幾種不同的方式隱藏在圖像文件中——直接附加到文件末尾,通過微小的代碼更改巧妙地合并,甚至隱藏在圖像的元數(shù)據(jù)或EXIF數(shù)據(jù)中。惡意代碼通常被設(shè)計為遠程執(zhí)行或在文件打開時執(zhí)行,這意味著存儲文檔中處于休眠狀態(tài)、未被檢測到的惡意代碼可能會等待數(shù)天、數(shù)周甚至數(shù)月,然后突然釋放危險內(nèi)容。網(wǎng)絡(luò)攻擊者不僅可以利用網(wǎng)站的系統(tǒng):如果一位毫無戒心的客戶端用戶下載了一個受感染的文件,他們的設(shè)備很快就會被入侵或破壞,嚴重(也許是永久)損害企業(yè)的聲譽。
緩解圖像文件上傳威脅,首先要實施強大的病毒和惡意軟件檢測策略,還需要采取合理的文件上傳驗證措施。例如,異常大的圖像文件可能表明存在隱藏的威脅,因此了解(并可能標準化)圖像上傳的大小有助于更快地檢測威脅。此外,限制允許上傳的不同文件擴展名的數(shù)量(例如,限制為PNG或JPG)使文件擴展名驗證更容易、更有效。文件擴展名和標頭也不應(yīng)該盲目信任——徹底的內(nèi)容驗證應(yīng)該始終考慮到文件結(jié)構(gòu)和文件編碼。
演示兩個解決方案
在本文的其余部分中,將演示兩個簡單的、免費使用的解決方案,它們可以在圖像文件上傳到云存儲之前幫助進行病毒掃描和驗證。兩者都可以有效地利用互補的、可運行的Java代碼示例來構(gòu)建API調(diào)用。這些API分別執(zhí)行以下功能:
(1)掃描圖像文件是否有病毒
(2)驗證圖像文件
這兩個API相互結(jié)合使用,可以幫助確保圖像上傳是有效的,并且沒有病毒和惡意軟件,從而顯著降低與圖像文件直接上傳相關(guān)的風險。
掃描圖文件是否有病毒
這個API配備了1700萬多個病毒和惡意軟件簽名,涵蓋了特洛伊木馬、勒索軟件和間諜軟件等極其常見的威脅。它也不局限于圖像文件(當然還可以掃描PDF、DOCX、XLSX等文檔),因此,如果用戶的文件上傳過程接受多種文件類型,它提供了一些多功能性。所有掃描的文件最終將收到一個“CleanResult:True”或“CleanResult:False”。布爾響應(yīng)中如果為false,則檢測到的病毒的名稱將在API響應(yīng)中提供。
要安裝客戶機SDK,首先,在Maven POM文件中添加對存儲庫的引用。Jitpack用于動態(tài)編譯庫:
XML
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
之后,添加對依賴項的引用:
XML
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
在安裝完成后,可以使用以下補充代碼示例構(gòu)建API調(diào)用:
Java
// 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();
}
在測試這一解決方案時,建議徹底研究可以安全地觸發(fā)“CleanResult:False”響應(yīng)的惰性文件的選項(例如,Eicar文件在這方面通常是一個流行的選擇)。
驗證圖像文件
這個API旨在嚴格驗證數(shù)十種常見的輸入圖像類型,包括JPG、PNG、WEBP、GIF等等。它將識別圖像上傳中包含的內(nèi)容是否與其擴展名匹配,文件是否受密碼保護,以及文件中是否存在任何錯誤和警告。如果檢測到任何錯誤,API響應(yīng)將提供錯誤的描述、錯誤的路徑和一個供參考的URI。
可以像以前一樣安裝這個客戶端SDK。將這一引用添加到MavenPOM文件存儲庫中:
XML
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
然后,添加對依賴項的引用:
XML
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
最后,可以使用下面的現(xiàn)成代碼示例來構(gòu)建API調(diào)用:
Java
// 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();
}
原文標題:How To Scan and Validate Image Uploads in Java,作者:Brian O'Neill