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

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

一、情况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 注解来声明并配置过滤器。
相关推荐
李永奉7 小时前
杰理可视化SDK开发-【BUG】AC7006F8更换AC7006F6芯片添加双备份OTA升级功能报代码端空间不足问题
bug
stevenzqzq8 小时前
解决复杂bug思路
bug
namexingyun14 小时前
Scaling Law bug实战启示:从“虚胖“到“精瘦“的算力效率革命
开发语言·网络·人工智能·bug·ai编程
callJJ22 天前
Volta + Claude Code 在 Windows 上的路径 Bug 复盘
windows·bug
xsc-xyc23 天前
记一次RK3568搭建NAS BUG:开发板插上 USB 移动硬盘没反应
bug
放风铃的兔子24 天前
我把 5 个 Python bug 投进 CubeSandbox 当沙盘 —— 从 envd 协议反编译到一键 RED→GREEN
bug·issue
zh_xuan25 天前
诡异Bug:输入框删除字符,却越删越多
android·bug
绘梨衣54725 天前
采集基类设计遇到的描述符bug
爬虫·python·bug
不吃鱼的羊25 天前
达芬奇工具Bug
bug
油炸自行车1 个月前
【bug】Qt 6 Q_NAMESPACE 跨 DLL 链接错误:LNK2019 无法解析 staticMetaObject
数据库·c++·qt·bug·link2019·q_namespace_exp·namespaceexport