• [安全类] Xss跨站脚本攻击 springboot [解释与代码校验]


    目录

    1. 了解xss攻击原理:

     2. 代码防御:  

    3. 使用springboot中的自定义校验注解

    4.  自定义校验注解@Xss并指定校验逻辑

    -> 注意这个注解 @Constraint(validatedBy = {XssValidator.class})

    5. XssValidator 注解实现逻辑

    6. 使用场景(插入用户名等时 用户不能有特殊字符)


    1. 了解xss攻击原理:

    XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScriptActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容

     2. 代码防御:  

    XSS攻击主要是由程序漏洞造成的, 这里只引用了解释之一

    不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST而非GET提交表单;对“<”,“>”,“;”,“””等字符做过滤;任何内容输出到页面之前都必须加以en-code,避免不小心把htmltag显示出来。

    3. 使用springboot中的自定义校验注解

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-validationartifactId>
    4. dependency>

    4.  自定义校验注解@Xss并指定校验逻辑

    1. /**
    2. * 自定义xss校验注解
    3. */
    4. @Retention(RetentionPolicy.RUNTIME)
    5. @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
    6. @Constraint(validatedBy = {XssValidator.class})
    7. public @interface Xss {
    8. String message() default "不允许任何脚本运行";
    9. Class[] groups() default {};
    10. Classextends Payload>[] payload() default {};
    11. }

    -> 注意这个注解 @Constraint(validatedBy = {XssValidator.class})

    指定了xss的校验逻辑 看看String类型参数 是否存在<>等非法字符

    如果存在 提示或 进行其他逻辑操作

    5. XssValidator 注解实现逻辑

    1. import com.ruoyi.common.utils.StringUtils;
    2. import javax.validation.ConstraintValidator;
    3. import javax.validation.ConstraintValidatorContext;
    4. import java.util.regex.Matcher;
    5. import java.util.regex.Pattern;
    6. /**
    7. * 自定义xss校验注解实现
    8. */
    9. public class XssValidator implements ConstraintValidator {
    10. private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
    11. /**
    12. * 判断是否需要校验
    13. *
    14. * true 表示放行
    15. * false 表示拦截 {@code false} if {@code value} does not pass the constraint
    16. * @param value
    17. * @param constraintValidatorContext
    18. * @return
    19. */
    20. @Override
    21. public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
    22. if (StringUtils.isBlank(value)) {
    23. //System.out.println(constraintValidatorContext.getDefaultConstraintMessageTemplate());
    24. return true;
    25. }
    26. return !containsHtml(value);
    27. }
    28. public static boolean containsHtml(String value) {
    29. Pattern pattern = Pattern.compile(HTML_PATTERN);
    30. Matcher matcher = pattern.matcher(value);
    31. return matcher.matches();
    32. }
    33. }

    6. 使用场景(插入用户名等时 用户不能有特殊字符)

    1. @Xss(message = "用户名不能包含特殊字符")
    2. @NotBlank(message = "用户账号不能为空")
    3. @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
    4. public String getUserName(){
    5. return userName;
    6. }

     在业务代码中使用并测试

  • 相关阅读:
    centos 安装ffmpeg
    Nacos 配置中心底层原理(1.X版本)
    Django基础学习
    测试概念第三篇—注册登陆测试用例
    Tomcat开发配置教程
    腾讯核心人员纯手写出这份JAVA面试全集总结,简直不要太香了!
    制作一个简单的Chrome extensions并发布到应用商店
    三谈exception——错误处理
    (附源码)小程序springboot口腔诊所预约系统 毕业设计 201738
    HTML+CSS详细知识点(下)
  • 原文地址:https://blog.csdn.net/pingzhuyan/article/details/126807716