SVG Sanitizer 是一个 Java 库,旨在清理 SVG 文件,通过移除潜在危险的 JavaScript、阻止外部资源加载,并防止 XSS(跨站脚本攻击) 漏洞。它可用于确保 SVG 文件在各种应用中安全使用,包括 Web 环境。
<script> 标签。要在你的 Java 项目中使用 SVG Sanitizer,请引入 io.github.borewit:svg-sanitizer Maven 依赖。
public class SVGSanitizerExample {
public static void main(String[] args) {
String dirtySvgContent = """
<svg xmlns="http://www.w3.org/2000/svg" width="400" height="400" viewBox="0 0 124 124" fill="none">
<rect width="124" height="124" rx="24" fill="#000000"/>
<script type="text/javascript">
alert(0x539);
</script>
</svg>""";
try {
String sanitizedSvg = SVGSanitizer.sanitize(dirtySvgContent);
System.out.println(sanitizedSvg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这将输出经过清理的 SVG:
<svg xmlns="http://www.w3.org/2000/svg" fill="none" height="400" viewBox="0 0 124 124" width="400">
<rect fill="#000000" height="124" rx="24" width="124"/>
</svg>
从 InputStream 净化到 OutputStream:
import java.io.*;
public class SVGSanitizerExample {
public static void main(String[] args) throws Exception {
File inputFile = new File("unsafe.svg");
File outputFile = new File("sanitized.svg");
try (InputStream inputStream = new FileInputStream(inputFile)) {
try (OutputStream outputStream = new FileOutputStream(outputFile)) {
SVGSanitizer.sanitize(inputStream, outputStream);
}
}
System.out.println("Sanitized SVG has been saved to " + outputFile.getAbsolutePath());
}
}
从 InputStream 清理到 InputStream:
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class SVGSanitizerExample {
public static void main(String[] args) throws Exception {
File inputFile = new File("unsafe.svg"); // Potentially unsafe SVG file
try (InputStream inputStream = new FileInputStream(inputFile);
InputStream sanitizedStream = SVGSanitizer.sanitize(inputStream)) {
// Pass the sanitized stream to an XML parser (without converting it to a String)
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(sanitizedStream);
System.out.println("SVG file successfully parsed after sanitization.");
}
}
}
public static String sanitize(String svgContent)
仅当将整个 SVG 加载到内存中不会造成问题时,才应使用此方法。
public static void sanitize(InputStream inputStream, OutputStream outputStream)
将清理后的 SVG 写入给定的 outputStream
public static InputStream sanitize(InputStream inputStream)
充当过滤器,返回一个经过清理的 InputStream,其中包含净化后的 SVG。
用户上传的 SVG 可能包含恶意内容,这些内容可能会在浏览器上下文中被执行。净化 SVG 是重要的一步,但应与其他措施结合使用以实现全面防护。 有关更全面的概述,请参阅 SVG 安全最佳实践。
本项目采用 MIT 许可证 授权。