使用剪贴板时避免不安全的二进制序列化

时间:2018-09-28 19:39:23

标签: c# clipboard

已经有一些问题解决了如何将自定义对象存储到剪贴板中。这要求将类标记为[可序列化],然后使用二进制序列化从剪贴板中检索它们。一个示例是here

但是,Microsoft发出有关二进制序列化的以下警告:

“二进制序列化可能很危险。切勿反序列化来自不受信任来源的数据,也不要将序列化数据往返于不受您控制的系统。” (here)。

为了避免二进制序列化,我尝试将剪贴板与[DataContract]而非[Serializable]一起使用,这似乎不起作用,并且未标记为[Serializable]的类被检索为'null'

因此,总结一下:

  • 在以下特定情况下使用二进制序列化是否安全? 剪贴板?我不能假设我信任该信息 剪贴板-用户可能已从任何地方复制了它。
  • 或者,可以避免二进制序列化存储 并从剪贴板中检索自定义对象?

编辑:使用“ GetText”将所有内容存储在文本中,将无法仅将文本粘贴到文本收件人(例如记事本)中,而无法粘贴到能够处理其他信息的其他容器中。 < / p>

1 个答案:

答案 0 :(得分:2)

您无需从剪贴板中获取数据并依靠二进制序列化/反序列化。您可以将剪贴板中的数据作为string来获取,该类型基本上是包含所需信息以及在剪贴板中如何表示的信息的类型,然后可以根据需要对其进行处理。

只需使用GetText方法,然后根据需要使用数据即可。

string clipboardText = Clipboard.GetText(TextDataFormat.Text);

然后,如果确实存在要将数据反序列化的类型,则可以使用newtonsoft.json nuget包对数据反序列化。

var myObject = Json.DeserializeObject<MyType>(clipboardText);

然后,您可以使用自定义对象。只需确保在try catch块中包含反序列化,即可处理数据格式不正确的情况。

如果您不需要坚持二进制序列化,那么我不建议您继续使用它,特别是因为如果发生错误,则很难跟踪和维护。