Упакуйте файлы схемы в dll, чтобы защитить их от подделки - PullRequest
0 голосов
/ 01 октября 2019

У меня проблема, аналогичная C # - Проверка xml-файла на наличие локальных проблем безопасности .xsd .

, но в первую очередь я не беспокоюсь о безопасности. Я надеюсь защитить свои файлы схемы от «глупого пользователя» больше, чем от фактического злоумышленника.

Есть ли возможность упаковать мои xsd-файлы в dll во время компиляции и использовать их оттуда во время выполнения (вместо простого чтения текстового файла из файловой системы)?

Еслиэто было бы внутри dll, «глупый пользователь» не смог бы просто отредактировать файлы случайно, и для злоумышленника мы могли бы даже пойти дальше и защитить 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"));

    }

Таким образом, вместо чтения их непосредственно из файловой системы во время инициализации, я хотел бы прочитать их как некоторый ресурс.

Так что-то похожее на файлы перевода. Создано во время компиляции и не подлежит изменению во время выполнения

1 Ответ

0 голосов
/ 01 октября 2019

Конечно, это возможно. Я делаю это так же, чтобы защитить их.

Сначала объявите их как Embedded Resource

enter image description here

Используйте это в коде

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);
    }
}
...