目录
-> 注意这个注解 @Constraint(validatedBy = {XssValidator.class})
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
XSS攻击主要是由程序漏洞造成的, 这里只引用了解释之一
不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST而非GET提交表单;对“<”,“>”,“;”,“””等字符做过滤;任何内容输出到页面之前都必须加以en-code,避免不小心把htmltag显示出来。
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-validationartifactId>
- dependency>
- /**
- * 自定义xss校验注解
- */
- @Retention(RetentionPolicy.RUNTIME)
- @Target(value = {ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
- @Constraint(validatedBy = {XssValidator.class})
- public @interface Xss {
-
- String message() default "不允许任何脚本运行";
-
- Class>[] groups() default {};
-
- Class extends Payload>[] payload() default {};
- }
指定了xss的校验逻辑 看看String类型参数 是否存在<>等非法字符
如果存在 提示或 进行其他逻辑操作
-
- import com.ruoyi.common.utils.StringUtils;
-
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
-
- /**
- * 自定义xss校验注解实现
- */
- public class XssValidator implements ConstraintValidator
{ -
- private static final String HTML_PATTERN = "<(\\S*?)[^>]*>.*?|<.*? />";
-
- /**
- * 判断是否需要校验
- *
- * true 表示放行
- * false 表示拦截 {@code false} if {@code value} does not pass the constraint
- * @param value
- * @param constraintValidatorContext
- * @return
- */
- @Override
- public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
- if (StringUtils.isBlank(value)) {
- //System.out.println(constraintValidatorContext.getDefaultConstraintMessageTemplate());
- return true;
- }
- return !containsHtml(value);
- }
-
- public static boolean containsHtml(String value) {
- Pattern pattern = Pattern.compile(HTML_PATTERN);
- Matcher matcher = pattern.matcher(value);
- return matcher.matches();
- }
- }
- @Xss(message = "用户名不能包含特殊字符")
- @NotBlank(message = "用户账号不能为空")
- @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
- public String getUserName(){
- return userName;
- }
在业务代码中使用并测试
