ホームページ > 記事 > ウェブフロントエンド > Jsoup_html/css_WEB-ITnose を使用したユーザー入力コンテンツの HTML セキュリティ フィルタリング
ウェブサイト上のinputまたはtextareaを使用して、投稿、記事、コメントなどの投稿などのコンテンツを入力する機能をユーザーに提供します。現時点では、バックエンド プログラムは、セキュリティ リスクを引き起こす可能性のある 3f1c4e4b6b16bbbd69b2ee476dc4f83a タグなどの入力コンテンツに対してセキュリティ フィルタリングを実行する必要があります。
JavaにはJsoupという、HTMLやXML文書を解析するためのオープンソースパッケージがあり、jqueryに似たオプション構文が使えるのが特徴です。
最近、コンテンツセキュリティフィルタリングを解決するときに、Jsoupがカスタマイズされたホワイトリスト(セキュリティラベルホワイトリスト)を通じてそのような機能を提供していることをGoogleで発見しました。これは非常に使いやすいです。
簡単なデモンストレーションは次のとおりです:
//HTML cleanString unsafe = "<table><tr><td>1</td></tr></table>" + "<img src='' alt='' />" + "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a>" + "<object></object>" + "<script>alert(1);</script>" + "</p>";String safe = Jsoup.clean(unsafe, Whitelist.relaxed());System.out.println("safe: " + safe);
公式 API アドレス: http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html
発見されたソース:
http:// www.oschina .net/question/12_10232、これに基づいてカスタム ヘルプ クラスを作成しました:
package com.cssor.safety; import org.jsoup.Jsoup;import org.jsoup.helper.StringUtil;import org.jsoup.safety.Whitelist; public class ContentSafeFilter { private final static Whitelist user_content_filter = Whitelist.relaxed(); static { //增加可信标签到白名单 user_content_filter.addTags("embed","object","param","span","div"); //增加可信属性 user_content_filter.addAttributes(":all", "style", "class", "id", "name"); user_content_filter.addAttributes("object", "width", "height","classid","codebase"); user_content_filter.addAttributes("param", "name", "value"); user_content_filter.addAttributes("embed", "src","quality","width","height","allowFullScreen","allowScriptAccess","flashvars","name","type","pluginspage"); } /** * 对用户输入内容进行过滤 * @param html * @return */ public static String filter(String html) { if(StringUtil.isBlank(html)) return ""; return Jsoup.clean(html, user_content_filter); //return filterScriptAndStyle(html); } /** * 比较宽松的过滤,但是会过滤掉object,script, span,div等标签,适用于富文本编辑器内容或其他html内容 * @param html * @return */ public static String relaxed(String html) { return Jsoup.clean(html, Whitelist.relaxed()); } /** * 去掉所有标签,返回纯文字.适用于textarea,input * @param html * @return */ public static String pureText(String html) { return Jsoup.clean(html, Whitelist.none()); } /** * @param args */ public static void main(String[] args) { String unsafe = "<table><tr><td>1</td></tr></table>" + "<img src='' alt='' />" + "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a>" + "<object></object>" + "<script>alert(1);</script>" + "</p>"; String safe = ContentSafeFilter.filter(unsafe); System.out.println("safe: " + safe); } }
Jsoup は、603830de8905840faf0669d054dd1ad2src 属性が削除されてしまうので、それを回避する簡単な方法を考えました:
/** * 自定义对用户输入内容进行过滤的标签 * @param html * @return */public static String filter(String html) { if(StringUtil.isBlank(html)) return ""; String baseUri = "http://baseuri"; return Jsoup.clean(html, baseUri, user_content_filter).replaceAll("src=\"http://baseuri", "src=\"");}
http://cssor.com/jsoup-whitelist-clean-html-for-user-content. html