当前位置:   article > 正文

JAVA WEB之XSS漏洞详解及防御措施_解决cross-site scripting(xss) java

解决cross-site scripting(xss) java

简述

人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。

跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。

攻击者可以使用户在浏览器中执行其预定义的恶意脚本,其导致的危害可想而知,如劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫,甚至破坏网站、修改路由器配置信息等。

XSS漏洞可以追溯到上世纪90年代。大量的网站曾遭受XSS漏洞攻击或被发现此类漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和百度贴吧。研究表明,最近几年XSS已经超过缓冲区溢出成为最流行的攻击方式,有68%的网站可能遭受此类攻击。根据开放网页应用安全计划(Open Web Application Security Project)公布的2010年统计数据,在Web安全威胁前10位中,XSS排名第2,仅次于代码注入(Injection)。

XSS漏洞的危害

XSS漏洞(跨站脚本攻击)的危害主要表现在以下几个方面:

  1. 窃取用户信息:攻击者可以在XSS漏洞中插入恶意脚本,从而获取用户的私密信息,例如:密码、身份证号等。
  2. 操纵用户行为:攻击者可以通过XSS脚本操纵用户的浏览器行为,例如:点击广告、下载恶意软件等。
  3. 挂马:攻击者可以通过XSS脚本在受害者的浏览器中运行恶意代码,从而植入恶意马。
  4. 钓鱼:攻击者可以利用XSS漏洞将恶意脚本注入到受害者的浏览器中,从而诱导受害者点击链接到恶意网站。
  5. 恶意操纵:攻击者可以通过XSS脚本操纵受害者的浏览器行为,例如:在受害者的浏览器中运行恶意代码、下载恶意软件等。
  6. 拒绝服务攻击(DDoS):攻击者可以利用XSS漏洞在受害者的浏览器中运行大量的恶意脚本,从而占用受害者的带宽和资源,导致受害者的网站无法正常访问。

总之,XSS漏洞的危害非常大,因为它可以直接攻击用户的隐私和安全。攻击者可以利用这个漏洞窃取用户信息、操纵用户行为、挂马、钓鱼、恶意操纵和进行DDoS攻击等。因此,网站开发者和用户都应该高度重视XSS漏洞的防范和修复工作。

正文

pom文件依赖

  1. <!--jsoup-->
  2. <dependency>
  3. <groupId>org.jsoup</groupId>
  4. <artifactId>jsoup</artifactId>
  5. <version>1.13.1</version>
  6. </dependency>

工具类代码 

  1. import org.jsoup.Jsoup;
  2. import org.jsoup.safety.Whitelist;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. /**
  6. * Xss防御工具类
  7. *
  8. * @author tarzan liu
  9. * @version V1.0
  10. * @date 2021年7月11日
  11. */
  12. public class XssKillerUtil {
  13. private static final String[] WHITE_LIST = {"p", "strong", "pre", "code", "span", "blockquote", "em", "a"};
  14. private static String reg = null;
  15. private static String legalTags = null;
  16. static {
  17. StringBuilder regSb = new StringBuilder("<");
  18. StringBuilder tagsSb = new StringBuilder();
  19. for (String s : WHITE_LIST) {
  20. regSb.append("(?!").append(s).append(" )");
  21. tagsSb.append('<').append(s).append('>');
  22. }
  23. regSb.append("(?!/)[^>]*>");
  24. reg = regSb.toString();
  25. legalTags = tagsSb.toString();
  26. }
  27. /**
  28. * xss白名单验证
  29. *
  30. * @param xssStr
  31. * @return
  32. */
  33. public static boolean isValid(String xssStr) {
  34. if (null == xssStr || xssStr.isEmpty()) {
  35. return true;
  36. }
  37. Pattern pattern = Pattern.compile(reg);
  38. Matcher matcher = pattern.matcher(xssStr);
  39. while (matcher.find()) {
  40. String tag = matcher.group();
  41. if (!legalTags.contains(tag.toLowerCase())) {
  42. return false;
  43. }
  44. }
  45. return true;
  46. }
  47. /**
  48. * 自定义的白名单
  49. *
  50. * @return
  51. */
  52. private static Whitelist custom() {
  53. return Whitelist.none().addTags("p", "strong", "pre", "code", "span", "blockquote", "br").addAttributes("span", "class");
  54. }
  55. /**
  56. * 根据白名单,剔除多余的属性、标签
  57. *
  58. * @param xssStr
  59. * @return
  60. */
  61. public static String clean(String xssStr) {
  62. if (null == xssStr || xssStr.isEmpty()) {
  63. return "";
  64. }
  65. return Jsoup.clean(xssStr, custom());
  66. }
  67. }

使用示例代码

  1. @PostMapping("comment/save")
  2. public ResponseVo saveComment(HttpServletRequest request, Comment comment) throws UnsupportedEncodingException {
  3. if (StringUtils.isEmpty(comment.getNickname())) {
  4. return ResultUtil.error("请输入昵称");
  5. }
  6. String content = comment.getContent();
  7. if (!XssKillerUtil.isValid(content)) {
  8. return ResultUtil.error("内容不合法");
  9. }
  10. content = XssKillerUtil.clean(content.trim()).replaceAll("(<p><br></p>)|(<p></p>)", "");
  11. Date date = new Date();
  12. comment.setContent(content);
  13. comment.setIp(IpUtil.getIpAddr(request));
  14. comment.setCreateTime(date);
  15. comment.setUpdateTime(date);
  16. if (StringUtils.isNotBlank(comment.getQq())) {
  17. comment.setAvatar("http://q1.qlogo.cn/g?b=qq&nk=" + comment.getQq() + "&s=100");
  18. } else if (StringUtils.isNotBlank(comment.getEmail())) {
  19. String entry = null;
  20. try {
  21. entry = MD5Util.md5Hex(comment.getEmail());
  22. } catch (NoSuchAlgorithmException e) {
  23. log.error("MD5出现异常{}", e.getMessage(), e);
  24. }
  25. comment.setAvatar("http://www.gravatar.com/avatar/" + entry + "?d=mp");
  26. }
  27. boolean a = commentService.save(comment);
  28. if (a) {
  29. return ResultUtil.success("评论提交成功,系统正在审核");
  30. } else {
  31. return ResultUtil.error("评论提交失败");
  32. }
  33. }

补充知识

XSS(Cross-Site Scripting)是Web应用程序中常见的安全漏洞之一。它允许攻击者将恶意脚本注入到受害者的浏览器中,从而在用户浏览网页时执行这些恶意脚本。在本文中,我们将详细解析XSS漏洞,包括其原理、类型和防范措施。

1.原理

XSS漏洞的产生主要是由于Web应用程序未能正确过滤和验证用户输入。攻击者利用这个漏洞,将恶意脚本注入到页面中的可执行区域,如HTML标签、JavaScript代码或URL参数等。当受害者浏览这个被注入恶意脚本的页面时,浏览器会执行这些脚本,导致攻击者能够获取用户的敏感信息或进行其他恶意操作。

2.类型

XSS漏洞可以分为以下几种类型:

  • 存储型XSS:恶意脚本被存储在服务器端,当其他用户浏览相关页面时会执行这些脚本。
  • 反射型XSS:恶意脚本作为URL参数或表单数据传递给服务器端,服务器将其返回给浏览器,浏览器执行这些脚本。
  • DOM型XSS:通过修改页面的DOM结构来触发漏洞,攻击者可以控制页面的行为和内容。

3. 防范措施

为了防止XSS漏洞的产生,我们可以采取以下几种措施:

  • 输入验证和过滤:对用户输入的数据进行验证,并过滤掉可能包含恶意代码的字符和标签。
  • 输出编码:在将用户输入的数据输出到页面时,确保对其进行合适的编码,以防止浏览器执行其中的脚本。
  • 使用HTTP Only Cookie:将会话标识符设置为HTTP Only Cookie,防止恶意脚本获取到用户的Cookie信息。
  • Content Security Policy(CSP):使用CSP来限制页面中可执行的脚本和资源,只允许从指定的源加载内容。

XSS漏洞是Web应用程序安全中非常重要的一环。开发人员应始终对用户输入进行严格验证和过滤,并在输出时进行适当的编码。此外,及时更新和修补应用程序中存在的安全漏洞也是防范XSS攻击的关键。通过采取综合的安全措施,我们能够最大程度地减少XSS漏洞的风险,保护用户的数据安全。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/150368
推荐阅读
相关标签
  

闽ICP备14008679号