在c#中安全地解析XML
本文关键字:XML 安全 | 更新日期: 2023-09-27 18:12:09
我有一个c#应用程序,它从表示UTF-8编码的XML消息的外部服务接收字节数组。此XML数据包含敏感数据,我不希望将这些数据存储在字符串对象中,因为字符串是不可变的,并且在处理完它们后无法擦除这些值。我目前使用System.XML.XmlReader将值解析为字符串(参见下面的代码)。如果不让我的代码(或我正在调用的代码)将敏感数据存储为字符串,我如何才能做到这一点?
byte[] messsage = Encoding.UTF8.GetBytes(request);
// Send message to the server.
sslStream.Write(messsage);
sslStream.Flush();
// read the response
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
do
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
// Check for ending tag.
if (messageData.ToString().IndexOf(expectedEndTag) != -1)
{
break;
}
} while (bytes > 0);
string response = messageData.ToString();
using (XmlReader reader = XmlReader.Create(new StringReader(response)))
{
reader.ReadToFollowing("Success");
string successVal = reader.ReadElementContentAsString();
success = bool.Parse(successVal);
}
根据答案,并且考虑到字符串是不可变的,您应该编写自己的XML解析器,使用char[]。在完成解析之后,清除字符数组内容。要在程序中使用敏感数据,请使用SecureString作为评论中建议的@Ga ber-ber和@Mumbo。
这是一个困难的工作重复,但这样可以确保在解析后立即清除内存。