006-绕过web检查,传输sql语句的功能

import org.apache.commons.text.StringEscapeUtils;
/**
 * 作用:
 * 实现绕过web检查,传输sql语句的功能
 *
 * pom:
 * org.apache.commons:commons-lang3:3.12.0
 * org.apache.commons:commons-text:1.10.0
 */
public class Main {
    public static void main(String[] args) {
        String sqlQuery = "select * from data_source where 1=1 <if test=\"id != null and id !=''\"> and id < ${id} </if>";

        // 编码 SQL 查询字符串
        String encodedSql = encodeSqlString(sqlQuery);

        // 模拟传递给前端的过程
        System.out.println("Encoded SQL for frontend: " + encodedSql);

        // 解码 HTML 实体
        String decodedSql = decodeHtmlEntities(encodedSql);

        // 打印解码后的 SQL 查询字符串
        System.out.println("Decoded SQL from frontend: " + decodedSql);

    }

    // 编码 SQL 查询字符串的方法
    public static String encodeSqlString(String sqlQuery) {
        if (sqlQuery == null) {
            throw new IllegalArgumentException("SQL query cannot be null");
        }

        // 使用 StringEscapeUtils.escapeSql() 方法进行 SQL 字符串转义
        return StringEscapeUtils.escapeHtml4(sqlQuery);
    }

    // 解码 HTML 实体的方法
    public static String decodeHtmlEntities(String encodedString) {
        // 使用 Apache Commons Text 中的 StringEscapeUtils 进行 HTML 实体解码
        return StringEscapeUtils.unescapeHtml4(encodedString);
    }
}
// 上面的方法前端不好转换,建议还是使用转为16进制的方案
// 也可以使用若依的common模块 EscapeUtil 工具类中提供的方法,转16进制编码进行传输;
posted on 2024-07-26 14:53  数据厨房  阅读(4)  评论(0编辑  收藏  举报