java之如何在 Java 中使用 Google Caja HTML/CSS sanitizer JS 库
我有一个接受自定义 CSS 字段的 Java API。我需要在将 CSS 存储到我的数据库之前对其进行清理,并希望使用 Google Caja为此。
首先,我尝试运行 Google Caja HTML/CSS sanitizer使用 Rhino JavaScript engine 的 JavaScript 库.不幸的是,这没有用,因为该库在很大程度上依赖于 DOM 的存在(特别是 window
对象)。
接下来,我从 Maven repository 导入了 Caja 元素.我查看了一些测试,但找不到如何使用 sanitizer 的示例。
我可以试试 bringing the browser to the server ,但这似乎有点过分。
有没有人能够使用 Caja 清理 Java 中的 CSS 字符串?
提前致谢!
请您参考如下方法:
如果您计划在 Java 服务器上进行清理,我建议您使用 OWASP HTML Sanitizer ,这显然是基于 Caja 的代码。它包括 sanitizer 能力 <a>
要包含的元素 rel="nofollow"
.
import org.owasp.html.PolicyFactory;
import static org.owasp.html.Sanitizers.BLOCKS;
import static org.owasp.html.Sanitizers.FORMATTING;
import static org.owasp.html.Sanitizers.IMAGES;
import static org.owasp.html.Sanitizers.LINKS;
PolicyFactory sanitiser = BLOCKS.and(FORMATTING).and(IMAGES).and(LINKS);
String htmlSanitised = sanitiser.sanitize(htmlSource)
不过,要从 Java 调用 Caja,这对 Rhino (Java 7) 和 Nashorn (Java 8) 都有效:
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CajaSanitiser {
private final ScriptEngine engine;
private final Bindings bindings;
public CajaSanitiser() throws IOException, ScriptException {
this.engine = new ScriptEngineManager().getEngineByName("js");
this.bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
String scriptName = "com/google/caja/plugin/html-css-sanitizer-minified.js";
try (BufferedReader reader = getReader(scriptName)) {
engine.eval(reader);
}
String identity = "function identity(value) {return value;}";
engine.eval(identity);
}
private BufferedReader getReader(String name) {
return new BufferedReader(new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(name)));
}
public String sanitise(String htmlSource) throws ScriptException {
bindings.put("src", htmlSource);
// You can use other functions beside 'identity' if you
// want to transform the html.
// See https://code.google.com/p/google-caja/wiki/JsHtmlSanitizer
return (String) engine.eval("html_sanitize(src, identity, identity)");
}
public static void main(String[] args) throws Exception {
CajaSanitiser sanitiser = new CajaSanitiser();
String source = "<html>\n" +
"<head>\n" +
"<style>\n" +
"h1 {color:blue;}\n" +
"</style>\n" +
"</head>\n" +
"<body>\n" +
"<h1>A heading</h1>\n" +
"</body>\n" +
"</html>";
System.out.println("Original HTML with CSS:");
System.out.println(source);
System.out.println();
System.out.println("Sanitised HTML:");
System.out.println(sanitiser.sanitise(source));
}
}
我将其用作我的 Maven 配置的一部分:
<dependencies>
<dependency>
<groupId>caja</groupId>
<artifactId>caja</artifactId>
<version>r5127</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>caja</id>
<name>caja</name>
<url>http://google-caja.googlecode.com/svn/maven</url>
</repository>
</repositories>
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。