针对 % 号 | 引起的 不安全情况

把网站开放的课程都检索下来了

一、情况1

org.apache.tomcat.util.http.Parameters processParameters 信息: Character decoding failed. Parameter [Mac] with value [%%%] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values. Note: further occurrences of Parameter errors will be logged at DEBUG level.

二、解释

Tomcat 在处理请求参数时遇到了字符解码失败的情况。具体来说,它发现了一个名为 "Mac" 的参数,其值为 "%%%",但是由于解码失败,它将该参数忽略了。

这种情况通常发生在客户端发送的请求参数值包含了不正确的编码字符时。在 HTTP 请求中,参数值应该是经过 URL 编码的,以确保传输过程中不会出现问题。URL 编码会将一些特殊字符转换成 % 加上对应的 ASCII 值的十六进制表示,以确保它们能够被安全地传输和解析。

在这个错误信息中,参数值为 "%%%",这可能是因为客户端在发送请求时出现了错误,导致了参数值被错误地编码了多次。

解决这个问题的方法是确保客户端发送的请求是正确的,参数值经过了正确的编码。你可能需要检查发送请求的代码,确保参数值在发送之前被正确地 URL 编码了。另外,还可以查看客户端发送请求时是否存在其他的错误或异常情况。

三、情况2

在 SQL 查询中,百分号(%)通常用作通配符,用于模糊匹配。当你在查询语句中使用 % 时,它会匹配任意数量(包括零个)的字符。这在查询时可以非常有用,特别是在需要进行模糊搜索或匹配的情况下。

例如,在使用 LIKE 关键字进行模糊搜索时,你可以使用 % 来匹配任意字符。例如:

SELECT * FROM users WHERE username LIKE 'joh%';

四、解释

恶意用户可能会利用这种通配符来执行 SQL 注入攻击,因此在构建 SQL 查询时,确保对用户输入进行正确的处理和过滤是非常重要的。

五、解决办法

当涉及到从前端向后端传递数据时,需要确保对用户输入进行适当的过滤和验证,以防止潜在的安全风险,比如 SQL 注入、跨站脚本攻击(XSS)等。以下是前端 JavaScript 和后端过滤器的一些方法:

5.1 前端

前端 JavaScript 过滤和验证:

1.输入验证:在前端,使用 JavaScript 对用户输入进行验证。可以使用正则表达式或者内置的验证函数,确保输入符合预期的格式和要求。

复制代码
function validateInput(input) {
    // 使用正则表达式验证输入
    const regex = /^[a-zA-Z0-9_]+$/; // 例如,只允许字母、数字和下划线
    return regex.test(input);
}

2.编码用户输入:在向后端发送数据之前,对用户输入进行编码,以确保特殊字符不会被解释为代码或指令。

复制代码
const userInput = document.getElementById('userInput').value;
const encodedInput = encodeURIComponent(userInput);

5.2 后端

后端过滤器/验证器:

  1. 输入过滤 :在后端,使用过滤器或验证器来处理接收到的用户输入数据。这可以是基于框架的过滤器、自定义的验证函数等。

    复制代码
    public boolean isValidInput(String input) {
        // 实现输入验证逻辑,例如检查输入是否符合预期格式
        // 如果不符合,返回 false;否则返回 true
    }

六、其他办法

在 Spring Boot 和 MyBatis 框架中,可以使用拦截器(Interceptor)或者过滤器(Filter)来过滤请求参数。同时,确实,在数据库查询时使用分页可以有效地减少一次性加载大量数据的风险。

分页查询:

在使用 MyBatis 进行数据库查询时,可以使用其提供的分页插件来实现分页功能,比如 MyBatis 分页助手(MyBatis PageHelper)。

1.引入 PageHelper 依赖:在 Maven 或 Gradle 中引入 MyBatis 分页插件的依赖。

2.配置分页插件 :在 MyBatis 的配置文件(通常是 application.ymlapplication.properties)中配置分页插件。

mybatis:

plugin:

pagehelper:

helperDialect: mysql

reasonable: true

supportMethodsArguments: true

3.在查询方法中使用分页:在需要分页查询的方法中,调用 PageHelper 的静态方法来设置分页参数。

复制代码
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> getUsers(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return userMapper.getUsers();
    }
}

过滤请求参数:

使用拦截器(Interceptor):
  1. 创建拦截器类 :创建一个拦截器类,实现 HandlerInterceptor 接口,重写 preHandle 方法,在该方法中对请求参数进行过滤或验证。
  2. 注册拦截器:在 Spring Boot 应用程序中注册拦截器,以便它能够拦截到相应的请求。
使用过滤器(Filter):
  1. 创建过滤器类 :创建一个过滤器类,实现 javax.servlet.Filter 接口,重写 doFilter 方法,在该方法中对请求参数进行过滤或验证。
  2. 配置过滤器 :在 Spring Boot 应用程序中,可以通过 @Component 或者 @Configuration 注解来声明并配置过滤器。
相关推荐
waves浪游14 小时前
自动化测试实战篇
测试用例·bug·测试
DarkAthena2 天前
【ORACLE】记录一些ORACLE的merge into语句的BUG
数据库·oracle·bug
猫猫头有亿点炸2 天前
大数据可能出现的bug之flume
大数据·bug·flume
PLUS_WAVE2 天前
【CUDA 编译 bug】ld: cannot find -lcudart
服务器·c++·bug·环境·编译·cuda·ld
宁酱醇2 天前
各种各样的bug合集
开发语言·笔记·python·gitlab·bug
有什么东东2 天前
山东大学软件学院创新项目实训开发日志(20)之中医知识问答自动生成对话标题bug修改
java·vue·bug·springboot
软件技术NINI2 天前
详解BUG(又名:BUG的生命周期)
bug
兮动人2 天前
Idea使用github copilot登录bug+解决方案
github·bug·intellij-idea
Macle_Chen2 天前
ios开发中xxx.debug.dylib not found
ios·bug·debug.dylib
福大大架构师每日一题3 天前
docker v28.1.1 正式发布!修复关键Bug,网络与安全性再升级
网络·docker·bug