- 类别:common 别名:— 优先级:—
- 作者:—
- 依赖:
jdk:com.sun.org.apache.xpath.internal.objects.XStringForFSB(实际使用其兄弟类XStringForChars,均为 JDK 内置 Xalan)
Equals → ToString 桥接构件,与 XStringToString1 同源,区别仅在于载体换成 XString 的子类 com.sun.org.apache.xpath.internal.objects.XStringForChars。上游以 equals() 触发时,继承自 XString 的 equals() 对参数调用 toString(),把链切到 toString 触发环。
- 入口
tags:Equals—— 承接「会调用equals()」的上一环。 - 衔接
nextTags:ToString—— 之后接由toString()触发的下游 gadget。 excludes:无。
public Object getObject() throws Exception {
XStringForChars xStringForChars = new XStringForChars(new char[0], 0, 0);
Reflections.set(xStringForChars, "m_strCache", "");
return xStringForChars;
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
Object obj2 = chain.doCreate(context);
Object obj1 = this.getObject();
Object[] objects = new Object[]{obj1, obj2};
return objects;
}XStringForChars是XString的子类,其构造器XStringForChars(char[], int, int)需要一个字符数组;这里传空数组new char[0], 0, 0构造一个「空字符串」载体。- 关键差异是那句
Reflections.set(xStringForChars, "m_strCache", ""):XString.str()会优先返回缓存字段m_strCache。XStringForChars基于字符数组,若不预置缓存,str()在某些路径下会去访问底层 char 缓冲区而可能抛异常或行为不稳;直接把m_strCache反射设为空串,保证equals()内this.str()稳定返回"",从而顺利走到obj2.toString()。 invoke的封装逻辑与同族一致:内层对象obj2与XStringForChars载体obj1打包成Object[]{obj1, obj2},交给上游Equals环,反序列化时触发obj1.equals(obj2)→obj2.toString()。
本类无 @Param,无用户可配字段。
- 使用 JDK 内置
XStringForChars;当环境对XString直接实例化不便、或需要一个「基于 char[] 的 XString 子类」作为载体时选用本变体。 m_strCache反射预置是本变体独有的关键点,保证str()不触碰空 char 缓冲;equals→toString语义仍继承自基类XString。- 受高版本 JDK 对
com.sun.*内部类模块封装影响时需注意可达性。
usedInChains 为空 —— 自由构件,未直接出现在 51 条预设链中。
- 上游(
tags=Equals):HashMapEquals、HashTableEquals、ConcurrentHashMapEquals等。 - 下游(
nextTags=ToString):由toString()触发的 gadget(BadAttributeValueExpExceptionToString、各*ToString系列)。 - 同族变体:XStringToString1、XStringToString3、XalanXStringToString1。