Почему мой метод не создает правильный XML-запрос из пользовательского ввода? - PullRequest
0 голосов
/ 22 ноября 2018

В настоящее время я пытаюсь взять пользовательский ввод из текстового поля и создать запрос XML с ним.

Запрос должен искать в документе элемент с заданным атрибутом dataItemId и возвращать значение innerText.Две строки кода, которые закомментированы в операторе try{}, работают как положено, возвращая правильное значение, но когда я пытаюсь использовать две строки над ними и вводить 'Xabs' в поле ввода, я получаю:

Ваш результирующий запрос XPath: // * [dataItemId = 'Xabs'] Элементы не найдены. "

Это должно быть как-то связано с тем, как анализируется строка, но яОшарашен что к чему.

public void MazakButton_Click(object sender, EventArgs e)
    {
        string userInput = searchInput.Text;
        ResultBox.Items.Clear();
        string query = "No Query Found";
        string searchResult = "No Items Found";

        if (userInput.Length > 3)// If query paramater is long enough
        {                
            //string Query = "\"//*[dataItemId = '" + userInput + "']\""; // Build Attribite Query
                query = "//*[dataItemId = '" + userInput + "']"; // Build Attribite Query
            XmlDocument MTData = MTFunctions.ScrapeXMLData(MazakSourceURL, false);

            try
            {
                XmlNode target = MTData.SelectSingleNode(query);
                searchResult = userInput + ": " + target.InnerText;
                //XmlNode target = MTData.SelectSingleNode("//*[@dataItemId = 'Xabs']"); 
                //searchResult = target.InnerText;
            }
            catch
            {
                Console.WriteLine("!!!!!!!!!!!!!!! - XML SEARCH FAILED - !!!!!!!!!!!!!!!");
            }
        }
        else{searchResult = "Invalid request (Too short)";}


        searchInput.Focus();
        ResultBox.Items.Add("Your Resultant Query XPath: " + query);
        ResultBox.Items.Add(searchResult);
        searchInput.Text = string.Empty; // Clear searchInput 
    }

1 Ответ

0 голосов
/ 22 ноября 2018

Первый пункт: вы никогда не должны строить запрос путем конкатенации строк, включающей пользовательский ввод.Google «Атаки по SQL-инъекциям» выяснит, почему (большая часть литературы написана на языке SQL, но XPath имеет точно такие же уязвимости).

Если вы используете выражение с переменной, например //*[dataItemId = $userInput], то (а) вы защищены от атак с использованием инъекций, (б) вам не нужно беспокоиться о экранировании специальных символов на входе (например, апострофах), и (в) это намного эффективнее, потому что вам нужно скомпилировать выражение XPath только один раз.

Единственная трудность состоит в том, что вам нужно решить, как предоставить параметр для запроса (то есть значение для $userInput), прежде чем выполнить его.Это зависит от API вашего процессора XPath, и я не знаком с процессором XPath, который вы используете, поэтому вам нужно исследовать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...