xiluoenm 2013-05-20
在做网站的时候,经常会提供用户评论的功能。有些不怀好意的用户,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,此时需要清理该HTML,以避免跨站脚本cross-site scripting攻击(XSS)。
可以选用的工具有:
使用jsoup HTML <a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryzmVh-0nEqC2a2Yf4KWmj3lGACXS4i6701TiWtV4yR1vg/" rel="nofollow" title="Cleaner">Cleaner</a>
方法进行清除,但需要指定一个可配置的 <a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryx0QsNb63maGxK8gVy3rmi-tLXhoxLRYGPx7_vK8rUN_g/" rel="nofollow" title="Whitelist">Whitelist</a>
。http://jsoup.org/apidocs/org/jsoup/safety/Whitelist.html (Jsoup 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>
OSChina网站使用的Jsoup, 对输入内容进行过滤的代码:
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 filterUserInputContent(String html) { if(StringUtils.isBlank(html)) return ""; return Jsoup.clean(html, user_content_filter); //return filterScriptAndStyle(html); }
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。所以我们经常只让用户输入纯文本的内容,但这样用户体验就比较差了。
一个更好的解决方法就是使用一个富文本编辑器WYSIWYG如CKEditor 和 TinyMCE。这些可以输出HTML并能够让用户可视化编辑。虽然他们可以在客户端进行校验,但是这样还不够安全,需要在服务器端进行校验并清除有害的HTML代码,这样才能确保输入到你网站的HTML是安全的。否则,攻击者能够绕过客户端的Javascript验证,并注入不安全的HMTL直接进入您的网站。
jsoup的whitelist清理器能够在服务器端对用户输入的HTML进行过滤,只输出一些安全的标签和属性。
jsoup提供了一系列的<a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryx0QsNb63maGxK8gVy3rmi-tLXhoxLRYGPx7_vK8rUN_g/" rel="nofollow" title="Whitelist">Whitelist</a>
基本配置,能够满足大多数要求;但如有必要,也可以进行修改,不过要小心。
这个cleaner非常好用不仅可以避免XSS攻击,还可以限制用户可以输入的标签范围。
<a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryzmVh-0nEqC2a2Yf4KWmj3lGACXS4i6701TiWtV4yR1vg/" rel="nofollow" title="Cleaner">Cleaner</a>
,了解如何返回一个 <a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryyu-ip1r2yK-S_Y0m_6v_qxthGAkHr95tCHL7HUvOiHQQ/" rel="nofollow" title="Document">Document</a>
对象,而不是字符串<a target="_blank" href="https://www.ancii.com/link/v1/Egek9NWuWfAxAiq3NGQvirxKU3xq3D8ppnEFpKwRryx0QsNb63maGxK8gVy3rmi-tLXhoxLRYGPx7_vK8rUN_g/" rel="nofollow" title="Whitelist">Whitelist</a>
,了解如何创建一个自定义的whitelist转自:http://www.open-open.com/jsoup/whitelist-sanitizer.htm