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进制编码进行传输;