目录
1. 了解xss攻击原理:
?2. 代码防御:??
3. 使用springboot中的自定义校验注解
4.? 自定义校验注解@Xss并指定校验逻辑
-> 注意这个注解 @Constraint(validatedBy = {XssValidator.class})
5. XssValidator 注解实现逻辑
6. 使用场景(插入用户名等时 用户不能有特殊字符)
1. 了解xss攻击原理:
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、?VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
?2. 代码防御:??
XSS攻击主要是由程序漏洞造成的, 这里只引用了解释之一
不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST而非GET提交表单;对“<”,“>”,“;”,“””等字符做过滤;任何内容输出到页面之前都必须加以en-code,避免不小心把htmltag显示出来。
3. 使用springboot中的自定义校验注解
<!-- 自定义验证注解 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
4.? 自定义校验注解@Xss并指定校验逻辑
/**
* 自定义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 {};
}
-> 注意这个注解 @Constraint(validatedBy = {XssValidator.class})
指定了xss的校验逻辑 看看String类型参数 是否存在<>等非法字符
如果存在 提示或 进行其他逻辑操作
5. XssValidator 注解实现逻辑
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<Xss, String> {
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();
}
}
6. 使用场景(插入用户名等时 用户不能有特殊字符)
@Xss(message = "用户名不能包含特殊字符")
@NotBlank(message = "用户账号不能为空")
@Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
public String getUserName(){
return userName;
}
?在业务代码中使用并测试
?
[xss源代码 来自若依]
|