ความปลอดภัยของโปรแกรมประยุกต์บนเว็บเมื่อโหลดทรัพยากรภายนอก
โดยค่าเริ่มต้นAspose.WordsสำหรับJavaสามารถโหลดรีซอร์สระยะไกลเช่นรูปภาพCSSรูปแบบหรือเอกสารภายนอกHTMLเมื่อนำเข้าเอกสารหรือแทรกรูปภาพโดยใช้DocumentBuilder Behaviorเป็นสาเหตุของความเสี่ยงด้านความปลอดภัยบางอย่างถ้าไลบรารีเป็นส่วนหนึ่งของ.
ในบทความนี้เราจะดูที่ปัญหาด้านความปลอดภัยทั่วไปที่สามารถเกิดขึ้นเมื่อโหลดทรัพยากร.
ปัญหาด้านความปลอดภัย
มีจำนวนของปัญหาความปลอดภัยทั่วไปเมื่อโหลดทรัพยากรภายนอก.
เปิดเผยข้อมูลประจำตัวผ่านภาพที่เชื่อมโยง
บนโฮสต์ที่ใช้ Windows เอกสารที่มีการอ้างอิงถึงทรัพยากรที่ใช้เส้นทาง UNC เช่น '\example.com\a\b' จะถูกประมวลผลตามค่าเริ่มต้น ในสภาพแวดล้อมโดเมน การดำเนินการนี้จะทำให้โฮสต์ส่งข้อมูลรับรองโดเมนในรูปแบบแฮชไปยังเซิร์ฟเวอร์ที่ระบุ.
ผู้โจมตีจะได้รับข้อมูลประจำตัวของผู้ใช้หรือบัญชีบริการในรูปแบบแฮNTLM รเข้าถึงทรัพยากรใดๆที่เป็นเหยื่อผู้ใช้หรือบัญชีบริการ.
หากบัญชีที่เป็นปัญหาใช้รหัสผ่านที่อ่อนแอหรือคาดเดาได้ผู้โจมตีอาจทำการโจมตีรหัสผ่านที่.
การเปิดเผยภาพท้องถิ่นผ่านทางภาพที่เชื่อมโยง
คล้ายกับกรณีก่อนหน้านี้การประมวลผลเอกสารที่มีการอ้างอิงไปยังไฟล์ภาพท้องถิ่นจะส่งผ มูลที่ละเอียดอ่อน.
การปฏิเสธการให้บริการ
ผู้โจมตีสามารถอัปโหลดเอกสารที่อ้างอิงหรือรวมภาพขนาดใหญ่มาก–ที่เรียกว่า"ระเบิดบีบอัด" เมื่อประมวลผลภาพเหล่านี้ไลบรารีจะใช้หน่วยความจำจำนวนมากและเวลาCPU.
การปลอมแปลงคำขอฝั่งเซิร์ฟเวอร์ผ่านเนื้อหาที่เชื่อมโยง
ของที่อยู่และพอร์ตภายในIPจากนั้นส่งไปยังบริการเว็บโดยใช้ไลบรารีAspose.Wordsเพื่อประมวลผลเอกส.
ตามระยะเวลาที่บริการใช้ในการประมวลผลเอกสารผู้โจมตีสามารถกำหนดว่าชุดค่าผสมIP/พอร์ตถูกกรองโดยไฟร์วอลล์หรือไม่:
- ระยะเวลาในการประมวลผลนานขึ้นบ่งชี้ว่าแพ็คเก็ตTCPSYNที่ส่งโดยเซิร์ฟเวอร์ถูกปล่อยโดยไฟร์วอลล์
- เวลาในการประมวลผลอย่างรวดเร็วบ่งชี้ว่ามีการเชื่อมต่อที่ประสบความสำเร็จ
โซลูชั่นของปัญหาด้านความปลอดภัย
ในการแก้ปัญหาที่อธิบายไว้ข้างต้นและเพื่อปรับปรุงความปลอดภัยของเว็บแอ็พพลิเคชัน,คุณสามารถควบคุมหรือปิดใช้งานการโหลดทรัพยากรภายนอกโดยใช้IResourceLoadingCallback.
ตัวอย่างรหัสต่อไปนี้แสดงวิธีการปิดใช้งานการโหลดภาพภายนอก:
Java
public void loadDocument(String documentFilename) throws Exception
{
LoadOptions disableExternalImagesOptions = new LoadOptions();
disableExternalImagesOptions.setResourceLoadingCallback(new DisableExternalImagesHandler());
Document doc = new Document(documentFilename, disableExternalImagesOptions);
}
public static class DisableExternalImagesHandler implements IResourceLoadingCallback
{
public /*ResourceLoadingAction*/int resourceLoading(ResourceLoadingArgs args)
{
// Skip external images loading.
return (args.getResourceType() == ResourceType.IMAGE)
? ResourceLoadingAction.SKIP
: ResourceLoadingAction.DEFAULT;
}
}
ตัวอย่างรหัสต่อไปนี้แสดงวิธีการปิดใช้งานรีซอร์สระยะไกล:
Java
public void loadDocument2(String documentFilename) throws Exception
{
LoadOptions disableRemoteResourcesOptions = new LoadOptions();
disableRemoteResourcesOptions.setResourceLoadingCallback(new DisableRemoteResourcesHandler());
Document doc = new Document(documentFilename, disableRemoteResourcesOptions);
}
private static class DisableRemoteResourcesHandler implements IResourceLoadingCallback
{
public /*ResourceLoadingAction*/int resourceLoading(ResourceLoadingArgs args) throws Exception
{
return isLocalResource(args.getOriginalUri())
? ResourceLoadingAction.DEFAULT
: ResourceLoadingAction.SKIP;
}
// Simplified code.
private static boolean isLocalResource(String fileName) throws Exception
{
String protocol = null;
URI uri = new URI(fileName);
if (uri.isAbsolute())
{
protocol = uri.getScheme();
}
else
{
URL url = new URL(fileName);
protocol = url.getProtocol();
}
return "file".equalsIgnoreCase(protocol);
}
}