Android_GitHub_jsoup(二)数据修改 、HTML清理

SourceFrom:https://github.com/jhy/jsoup

SourceFrom:http://www.open-open.com/jsoup/parsing-a-document.htm


设置属性的值

问题

在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。

方法

可以使用属性设置方法 Element.attr(String key, String value), 和 Elements.attr(String key, String value).

假如你需要修改一个元素的 class 属性,可以使用 Element.addClass(String className)Element.removeClass(String className) 方法。

Elements 提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个 rel="nofollow" 可以使用如下方法:

doc.select("div.comments a").attr("rel", "nofollow");

说明

Element中的其它方法一样,attr 方法也是返回当 Element (或在使用选择器是返回 Elements 集合)。这样能够很方便使用方法连用的书写方式。比如:

doc.select("div.masthead").attr("title", "jsoup").addClass("round-box");

设置一个元素的HTML内容

问题

你需要一个元素中的HTML内容

方法

可以使用Element中的HTML设置方法具体如下:

Element div = doc.select("div").first(); // <div></div>
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");//在div前添加html内容
div.append("<p>Last</p>");//在div之后添加html内容
// 添完后的结果: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>

Element span = doc.select("span").first(); // <span>One</span>
span.wrap("<li><a href='http://example.com/'></a></li>");
// 添完后的结果: <li><a href="http://example.com"><span>One</span></a></li>

说明

  • Element.html(String html) 这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。
  • Element.prepend(String first)Element.append(String last) 方法用于在分别在元素内部HTML的前面和后面添加HTML内容
  • Element.wrap(String around) 对元素包裹一个外部HTML内容。

参见

可以查看API参考文档中 Element.prependElement(String tag)Element.appendElement(String tag) 方法来创建新的元素并作为文档的子元素插入其中。

设置元素的文本内容

问题

你需要修改一个HTML文档中的文本内容

方法

可以使用Element的设置方法::

Element div = doc.select("div").first(); // <div></div>
div.text("five > four"); // <div>five &gt; four</div>
div.prepend("First ");
div.append(" Last");
// now: <div>First five &gt; four Last</div>

说明

文本设置方法与 HTML setter 方法一样:

  • Element.text(String text) 将清除一个元素中的内部HTML内容,然后提供的文本进行代替
  • Element.prepend(String first)Element.append(String last) 将分别在元素的内部html前后添加文本节点。
对于传入的文本如果含有像 <, > 等这样的字符,将以文本处理,而非HTML。

消除不受信任的HTML (来防止XSS攻击)

问题

在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。

方法

使用jsoup HTML Cleaner 方法进行清除,但需要指定一个可配置的 Whitelist

String unsafe = 
  "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
// now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

说明

XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。

一个更好的解决方法就是使用一个富文本编辑器WYSIWYG如CKEditor 和 TinyMCE。这些可以输出HTML并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的HTML代码,这样才能确保输入到你网站的HTML是安全的。否则,攻击者能够绕过客户端的Javascript验证,并注入不安全的HMTL直接进入您的网站。

jsoup的whitelist清理器能够在服务器端对用户输入的HTML进行过滤,只输出一些安全的标签和属性。

jsoup提供了一系列的Whitelist基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。

这个cleaner非常好用不仅可以避免XSS攻击,还可以限制用户可以输入的标签范围。

参见

  • 参阅XSS cheat sheet ,有一个例子可以了解为什么不能使用正则表达式,而采用安全的whitelist parser-based清理器才是正确的选择。
  • 参阅Cleaner ,了解如何返回一个 Document 对象,而不是字符串
  • 参阅Whitelist,了解如何创建一个自定义的whitelist
  • nofollow 链接属性了解


你可能感兴趣的:(idtransmarkspa,idtransmark,idtransmark,idtransmark,andrspan,githspan,数span,classpan)