
Java-библиотека, которая очищает SVG-файлы, удаляя JavaScript, встроенные обработчики событий и теги script, а также блокируя загрузку внешних ресурсов для предотвращения XSS.
SVG Sanitizer — это Java-библиотека, предназначенная для очистки SVG-файлов путём удаления потенциально опасного JavaScript, блокировки загрузки внешних ресурсов и предотвращения уязвимостей XSS (межсайтовый скриптинг). Она полезна для обеспечения того, чтобы SVG-файлы были безопасны для использования в различных приложениях, включая веб-среды.
<script>.Чтобы использовать SVG Sanitizer в вашем Java-проекте, подключите зависимость Maven io.github.borewit:svg-sanitizer.
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 License