This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 5a27cb55b0 Enhance serializable check option (#11460)
5a27cb55b0 is described below
commit 5a27cb55b047b82d116a6e30153b7ff87f75d992
Author: Albumen Kevin <[email protected]>
AuthorDate: Tue Feb 14 15:15:51 2023 +0800
Enhance serializable check option (#11460)
* Enhance serializable check option
* Fix
---
.../common/utils/DefaultSerializeClassChecker.java | 4 ++
.../serialize/fastjson2/FastJson2ObjectInput.java | 44 +++++++++++++++-------
.../serialize/fastjson2/FastJson2ObjectOutput.java | 40 ++++++++++++++------
.../fastjson2/FastJson2Serialization.java | 6 ++-
.../fastjson2/Fastjson2SecurityManager.java | 5 +--
.../hessian2/Hessian2SerializerFactory.java | 31 +++++++++++++++
6 files changed, 100 insertions(+), 30 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
index a385ddf593..093cad8a96 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/DefaultSerializeClassChecker.java
@@ -201,4 +201,8 @@ public class DefaultSerializeClassChecker implements
AllowClassNotifyListener {
public static DefaultSerializeClassChecker getInstance() {
return
FrameworkModel.defaultModel().getBeanFactory().getBean(DefaultSerializeClassChecker.class);
}
+
+ public boolean isCheckSerializable() {
+ return checkSerializable;
+ }
}
diff --git
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectInput.java
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectInput.java
index d5975fdba6..10a261e555 100644
---
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectInput.java
+++
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectInput.java
@@ -16,15 +16,15 @@
*/
package org.apache.dubbo.common.serialize.fastjson2;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+
import org.apache.dubbo.common.serialize.ObjectInput;
import com.alibaba.fastjson2.JSONB;
import com.alibaba.fastjson2.JSONReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Type;
-
/**
* FastJson object input implementation
*/
@@ -111,11 +111,19 @@ public class FastJson2ObjectInput implements ObjectInput {
if (read != length) {
throw new IllegalArgumentException("deserialize failed. expected
read length: " + length + " but actual read: " + read);
}
- return (T) JSONB.parseObject(bytes, Object.class,
fastjson2SecurityManager.getSecurityFilter(),
- JSONReader.Feature.UseDefaultConstructorAsPossible,
- JSONReader.Feature.ErrorOnNoneSerializable,
- JSONReader.Feature.UseNativeObject,
- JSONReader.Feature.FieldBased);
+ Fastjson2SecurityManager.Handler securityFilter =
fastjson2SecurityManager.getSecurityFilter();
+ if (securityFilter.isCheckSerializable()) {
+ return (T) JSONB.parseObject(bytes, Object.class, securityFilter,
+ JSONReader.Feature.UseDefaultConstructorAsPossible,
+ JSONReader.Feature.ErrorOnNoneSerializable,
+ JSONReader.Feature.UseNativeObject,
+ JSONReader.Feature.FieldBased);
+ } else {
+ return (T) JSONB.parseObject(bytes, Object.class, securityFilter,
+ JSONReader.Feature.UseDefaultConstructorAsPossible,
+ JSONReader.Feature.UseNativeObject,
+ JSONReader.Feature.FieldBased);
+ }
}
@Override
@@ -128,11 +136,19 @@ public class FastJson2ObjectInput implements ObjectInput {
if (read != length) {
throw new IllegalArgumentException("deserialize failed. expected
read length: " + length + " but actual read: " + read);
}
- return (T) JSONB.parseObject(bytes, Object.class,
fastjson2SecurityManager.getSecurityFilter(),
- JSONReader.Feature.UseDefaultConstructorAsPossible,
- JSONReader.Feature.ErrorOnNoneSerializable,
- JSONReader.Feature.UseNativeObject,
- JSONReader.Feature.FieldBased);
+ Fastjson2SecurityManager.Handler securityFilter =
fastjson2SecurityManager.getSecurityFilter();
+ if (securityFilter.isCheckSerializable()) {
+ return (T) JSONB.parseObject(bytes, Object.class, securityFilter,
+ JSONReader.Feature.UseDefaultConstructorAsPossible,
+ JSONReader.Feature.ErrorOnNoneSerializable,
+ JSONReader.Feature.UseNativeObject,
+ JSONReader.Feature.FieldBased);
+ } else {
+ return (T) JSONB.parseObject(bytes, Object.class, securityFilter,
+ JSONReader.Feature.UseDefaultConstructorAsPossible,
+ JSONReader.Feature.UseNativeObject,
+ JSONReader.Feature.FieldBased);
+ }
}
private void updateClassLoaderIfNeed() {
diff --git
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectOutput.java
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectOutput.java
index 97c099f27b..025e7a603f 100644
---
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectOutput.java
+++
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2ObjectOutput.java
@@ -16,14 +16,14 @@
*/
package org.apache.dubbo.common.serialize.fastjson2;
+import java.io.IOException;
+import java.io.OutputStream;
+
import org.apache.dubbo.common.serialize.ObjectOutput;
import com.alibaba.fastjson2.JSONB;
import com.alibaba.fastjson2.JSONWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-
/**
* FastJson object output implementation
*/
@@ -31,11 +31,16 @@ public class FastJson2ObjectOutput implements ObjectOutput {
private final Fastjson2CreatorManager fastjson2CreatorManager;
+ private final Fastjson2SecurityManager fastjson2SecurityManager;
+
private volatile ClassLoader classLoader;
private final OutputStream os;
- public FastJson2ObjectOutput(Fastjson2CreatorManager
fastjson2CreatorManager, OutputStream out) {
+ public FastJson2ObjectOutput(Fastjson2CreatorManager
fastjson2CreatorManager,
+ Fastjson2SecurityManager
fastjson2SecurityManager,
+ OutputStream out) {
this.fastjson2CreatorManager = fastjson2CreatorManager;
+ this.fastjson2SecurityManager = fastjson2SecurityManager;
this.classLoader = Thread.currentThread().getContextClassLoader();
this.os = out;
fastjson2CreatorManager.setCreator(classLoader);
@@ -96,14 +101,25 @@ public class FastJson2ObjectOutput implements ObjectOutput
{
@Override
public void writeObject(Object obj) throws IOException {
updateClassLoaderIfNeed();
- byte[] bytes = JSONB.toBytes(obj, JSONWriter.Feature.WriteClassName,
- JSONWriter.Feature.FieldBased,
- JSONWriter.Feature.ErrorOnNoneSerializable,
- JSONWriter.Feature.ReferenceDetection,
- JSONWriter.Feature.WriteNulls,
- JSONWriter.Feature.NotWriteDefaultValue,
- JSONWriter.Feature.NotWriteHashMapArrayListClassName,
- JSONWriter.Feature.WriteNameAsSymbol);
+ byte[] bytes;
+ if
(fastjson2SecurityManager.getSecurityFilter().isCheckSerializable()) {
+ bytes = JSONB.toBytes(obj, JSONWriter.Feature.WriteClassName,
+ JSONWriter.Feature.FieldBased,
+ JSONWriter.Feature.ErrorOnNoneSerializable,
+ JSONWriter.Feature.ReferenceDetection,
+ JSONWriter.Feature.WriteNulls,
+ JSONWriter.Feature.NotWriteDefaultValue,
+ JSONWriter.Feature.NotWriteHashMapArrayListClassName,
+ JSONWriter.Feature.WriteNameAsSymbol);
+ } else {
+ bytes = JSONB.toBytes(obj, JSONWriter.Feature.WriteClassName,
+ JSONWriter.Feature.FieldBased,
+ JSONWriter.Feature.ReferenceDetection,
+ JSONWriter.Feature.WriteNulls,
+ JSONWriter.Feature.NotWriteDefaultValue,
+ JSONWriter.Feature.NotWriteHashMapArrayListClassName,
+ JSONWriter.Feature.WriteNameAsSymbol);
+ }
writeLength(bytes.length);
os.write(bytes);
os.flush();
diff --git
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2Serialization.java
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2Serialization.java
index c3143b339f..74ad821d54 100644
---
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2Serialization.java
+++
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/FastJson2Serialization.java
@@ -54,8 +54,12 @@ public class FastJson2Serialization implements Serialization
{
.map(URL::getOrDefaultFrameworkModel)
.orElse(FrameworkModel.defaultModel())
.getBeanFactory().getBean(Fastjson2CreatorManager.class);
+ Fastjson2SecurityManager fastjson2SecurityManager =
Optional.ofNullable(url)
+ .map(URL::getOrDefaultFrameworkModel)
+ .orElse(FrameworkModel.defaultModel())
+ .getBeanFactory().getBean(Fastjson2SecurityManager.class);
- return new FastJson2ObjectOutput(fastjson2CreatorManager, output);
+ return new FastJson2ObjectOutput(fastjson2CreatorManager,
fastjson2SecurityManager, output);
}
@Override
diff --git
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/Fastjson2SecurityManager.java
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/Fastjson2SecurityManager.java
index 8e94a66617..32e477b2e3 100644
---
a/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/Fastjson2SecurityManager.java
+++
b/dubbo-serialization/dubbo-serialization-fastjson2/src/main/java/org/apache/dubbo/common/serialize/fastjson2/Fastjson2SecurityManager.java
@@ -29,7 +29,6 @@ import org.apache.dubbo.common.utils.SerializeSecurityManager;
import org.apache.dubbo.rpc.model.FrameworkModel;
import com.alibaba.fastjson2.filter.ContextAutoTypeBeforeHandler;
-import com.alibaba.fastjson2.filter.Filter;
import com.alibaba.fastjson2.util.TypeUtils;
import static com.alibaba.fastjson2.util.TypeUtils.loadClass;
@@ -37,7 +36,7 @@ import static
org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_UNT
import static org.apache.dubbo.common.utils.SerializeCheckStatus.STRICT;
public class Fastjson2SecurityManager implements AllowClassNotifyListener {
- private volatile Filter securityFilter;
+ private volatile Handler securityFilter;
private static final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(Fastjson2SecurityManager.class);
@@ -77,7 +76,7 @@ public class Fastjson2SecurityManager implements
AllowClassNotifyListener {
}
- public Filter getSecurityFilter() {
+ public Handler getSecurityFilter() {
return securityFilter;
}
diff --git
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
index 1dcbe4e29b..8b26cbf411 100644
---
a/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
+++
b/dubbo-serialization/dubbo-serialization-hessian2/src/main/java/org/apache/dubbo/common/serialize/hessian2/Hessian2SerializerFactory.java
@@ -16,8 +16,14 @@
*/
package org.apache.dubbo.common.serialize.hessian2;
+import java.io.Serializable;
+
import org.apache.dubbo.common.utils.DefaultSerializeClassChecker;
+import com.alibaba.com.caucho.hessian.io.Deserializer;
+import com.alibaba.com.caucho.hessian.io.JavaDeserializer;
+import com.alibaba.com.caucho.hessian.io.JavaSerializer;
+import com.alibaba.com.caucho.hessian.io.Serializer;
import com.alibaba.com.caucho.hessian.io.SerializerFactory;
public class Hessian2SerializerFactory extends SerializerFactory {
@@ -32,4 +38,29 @@ public class Hessian2SerializerFactory extends
SerializerFactory {
public Class<?> loadSerializedClass(String className) throws
ClassNotFoundException {
return defaultSerializeClassChecker.loadClass(getClassLoader(),
className);
}
+
+ @Override
+ protected Serializer getDefaultSerializer(Class cl) {
+ if (_defaultSerializer != null)
+ return _defaultSerializer;
+
+ if (!Serializable.class.isAssignableFrom(cl)
+ && !isAllowNonSerializable()
+ && !defaultSerializeClassChecker.isCheckSerializable()) {
+ throw new IllegalStateException("Serialized class " + cl.getName()
+ " must implement java.io.Serializable");
+ }
+
+ return new JavaSerializer(cl, getClassLoader());
+ }
+
+ @Override
+ protected Deserializer getDefaultDeserializer(Class cl) {
+ if (!Serializable.class.isAssignableFrom(cl)
+ && !isAllowNonSerializable()
+ && !defaultSerializeClassChecker.isCheckSerializable()) {
+ throw new IllegalStateException("Serialized class " + cl.getName()
+ " must implement java.io.Serializable");
+ }
+
+ return new JavaDeserializer(cl);
+ }
}