将模式文件打包到 dll 中以防止它们被篡改
Pack schema files in a dll to secure them from tampering
我遇到了与 C# - Validating xml file against local .xsd security issues 类似的问题。
但我的观点首先不是安全问题。我希望保护我的模式文件免受 "stupid user" 的攻击,而不是真正的攻击者。
是否有可能在编译时将我的 xsd 文件打包到 dll 中并在运行时从那里使用它(而不是仅仅从文件系统读取文本文件)?
如果它在 dll 中,"stupid user" 将无法无意中编辑文件,对于攻击者,我们甚至可以更进一步,使用强命名和数字签名保护 dll .
internal class XmlValidator : Validator
{
private static XmlSchemaSet _schemas;
/// <summary>
/// Initializes a new instance of the <see cref="XmlValidator"/> class.
/// </summary>
internal XmlValidator()
{
string path;
path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
else
{
path = @".\";
}
// Add schemas
_schemas = new XmlSchemaSet();
_schemas.Add("http://myschema/schema1", Path.Combine(path, "Schemas", "schema-v1.0.xsd"));
_schemas.Add("http://myschema/schema11", Path.Combine(path, "Schemas", "chema-v1.1.xsd"));
}
因此,与其在初始化期间直接从文件系统读取它们,不如将它们作为某种资源来读取。
类似翻译文件的东西。编译时创建,运行时不可更改
当然可以。我用同样的方式来保护他们。
首先将它们声明为Embedded Resource
在代码中使用它
public void LoadXsd()
{
string resourceName = "DefaultNamespace.specs.info.IErrorInfo.xsd";
Assembly assembly = Assembly.GetExecutingAssembly();
XmlSchema xsd = XmlSchema.Read(assembly.GetManifestResourceStream(resourceName), _XsdSchema_ValidationEventHandler);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(xsd);
}
private void _XsdSchema_ValidationEventHandler(object sender, ValidationEventArgs e)
{
_Logger.Error($"XSD validation error: {e.Message}");
}
也可以一次加载它们:
public void LoadAllXsdFiles()
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
var assembly = Assembly.GetExecutingAssembly();
var allXsdFiles = assembly.GetManifestResourceNames().Where(r => r.EndsWith(".xsd"));
foreach (string xsdFile in allXsdFiles)
{
XmlSchema xsd = XmlSchema.Read(assembly.GetManifestResourceStream(xsdFile), _XsdSchema_ValidationEventHandler);
schemaSet.Add(xsd);
}
}
我遇到了与 C# - Validating xml file against local .xsd security issues 类似的问题。
但我的观点首先不是安全问题。我希望保护我的模式文件免受 "stupid user" 的攻击,而不是真正的攻击者。
是否有可能在编译时将我的 xsd 文件打包到 dll 中并在运行时从那里使用它(而不是仅仅从文件系统读取文本文件)?
如果它在 dll 中,"stupid user" 将无法无意中编辑文件,对于攻击者,我们甚至可以更进一步,使用强命名和数字签名保护 dll .
internal class XmlValidator : Validator
{
private static XmlSchemaSet _schemas;
/// <summary>
/// Initializes a new instance of the <see cref="XmlValidator"/> class.
/// </summary>
internal XmlValidator()
{
string path;
path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
}
else
{
path = @".\";
}
// Add schemas
_schemas = new XmlSchemaSet();
_schemas.Add("http://myschema/schema1", Path.Combine(path, "Schemas", "schema-v1.0.xsd"));
_schemas.Add("http://myschema/schema11", Path.Combine(path, "Schemas", "chema-v1.1.xsd"));
}
因此,与其在初始化期间直接从文件系统读取它们,不如将它们作为某种资源来读取。
类似翻译文件的东西。编译时创建,运行时不可更改
当然可以。我用同样的方式来保护他们。
首先将它们声明为Embedded Resource
在代码中使用它
public void LoadXsd()
{
string resourceName = "DefaultNamespace.specs.info.IErrorInfo.xsd";
Assembly assembly = Assembly.GetExecutingAssembly();
XmlSchema xsd = XmlSchema.Read(assembly.GetManifestResourceStream(resourceName), _XsdSchema_ValidationEventHandler);
XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(xsd);
}
private void _XsdSchema_ValidationEventHandler(object sender, ValidationEventArgs e)
{
_Logger.Error($"XSD validation error: {e.Message}");
}
也可以一次加载它们:
public void LoadAllXsdFiles()
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
var assembly = Assembly.GetExecutingAssembly();
var allXsdFiles = assembly.GetManifestResourceNames().Where(r => r.EndsWith(".xsd"));
foreach (string xsdFile in allXsdFiles)
{
XmlSchema xsd = XmlSchema.Read(assembly.GetManifestResourceStream(xsdFile), _XsdSchema_ValidationEventHandler);
schemaSet.Add(xsd);
}
}