Является ли значение содержимого метатега из запроса xpath надежным?

1

У меня есть функция php, которая извлекает метатеги из url с запросами xpath.

например $xpath->query('/html/head/meta[@name="my_target"]/@content')

Мой вопрос:

Могу ли я доверять возвращенному значению или проверить его?

=> Есть ли какой-либо возможный эксплойт XSS?

=> Следует ли очищать содержимое html перед загрузкой в DOMDocument?

 // Other way to say it with some code :

    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = false;
    libxml_use_internal_errors(true);

    // is
    $doc->loadHTMLFile($url);
    // trustable ??

    // or is
    file_get_contents($url);
    $trust = $purifier->purify($html);
    $doc->loadHTML($trust);
    // a better practice ??

    libxml_use_internal_errors(false);
    $xpath = new DOMXPath($doc);

    $trustable = $xpath->query('/html/head/meta[@name="my_target"]/@content')->item(0) // ?

===== UPDATE =======================================================================================

Да, никогда не доверяйте внешним источникам.

используйте $be_sure = htmlspecialchars($trustable->textContent) или strip_tags($trustable->textContent)

  • 0
    Мы не знаем, доверяете ли вы источнику вашего HTML или нет.
  • 0
    @Quentin Это то, что я тоже не
Теги:
xpath

1 ответ

0
Лучший ответ

Если вы вытаскиваете HTML-контент из источника, который не контролируете, то да, я считаю, что часть кода потенциально затруднительна!

Вы можете использовать htmlspecialchars() для преобразования любых специальных символов в объекты HTML. Или, если вы хотите сохранить части надбавки, вы можете использовать strip_tags(). Другой вариант - использовать filter_var(), который дает вам больше контроля над его фильтрацией.

Или вы можете использовать библиотеку, такую как HTML Purifier, но это может быть слишком много для вашей цели. Все зависит от типа контента, с которым вы работаете.

Теперь, чтобы очистить элемент, вам нужно сначала получить строковое представление вашего результата XPath. Примените свою фильтрацию, а затем верните ее. Следующий пример должен делать то, что вы хотите:

<?php
// The following HTML is what you fetch from your remote source:
$html = <<<EOL
<html>
 <body>
    <h1>Foo, bar!</h1>
    <div id="my-target">
        Here is some <strong>text</strong> <script>javascript:alert('some malicious script!');</script> that we want to sanitize.
    </div>
 </body>
</html>
EOL;

// We instantiate a DOCDocument so we can work with it:
$original = new DOMDocument("1.0", 'UTF-8');
$original->formatOutput = true;
$original->loadHTML($html);

$body = $original->getElementsByTagName('body')->item(0);

// Find the element we need using Xpath:
$xpath = new DOMXPath($original);
$divs  = $xpath->query("//body/div[@id='my-target']");

// The XPath query will return DOMElement objects, so create a string that we can manipulate out of it:
$innerHTML  = '';
if (count($divs))
{
    $div = $divs->item(0);

    // Now get the innerHTML for this element
    foreach ($div->childNodes as $child) {
        $innerHTML .= $original->saveXML($child);
    }

    // Remove it from the original document because we want to replace it anyway
    $div->parentNode->removeChild($div);
}

// Sanitize our string by removing all tags except <strong> and the container <div>
$innerHTML = strip_tags($innerHTML, '<strong>');
// or htmlspecialchars() or filter_var or HTML Purifier ..

// Now re-import the sanitized string into a blank DOMDocument
$sanitized = new DOMDocument("1.0", 'UTF-8');
$sanitized->formatOutput = true;
$sanitized->loadXML('<div id="my-target">' . $innerHTML . '</div>');

// Now add the sanitized DOMElement back into the original document as a child of <body>
$body->appendChild($original->importNode($sanitized->documentElement, true));

echo $original->saveHTML();

Надеюсь, это поможет.

  • 0
    Спасибо за Ваш ответ. В моем примере показан способ очистки моего контента (на самом деле $purifier - это ссылка на инструмент HTMLPurifier). Вопрос в том, является ли это лучшей практикой для очистки html только для содержимого метатега?
  • 1
    DOMdocument HTML-документ будет абсолютно безопасно помещать в DOMdocument , так как он не сможет запустить код PHP. DOMDocument просто разбирает строку. Даже если там есть эксплойт XSS, он будет выполняться только при выводе его в браузер. Что касается содержимого мета-тега, я бы определенно не пошел с решением как HTMLPurifier, поскольку это довольно тяжелая библиотека. Сначала загрузите его с помощью DOMdocument , затем извлеките содержимое htmlspecialchars и htmlspecialchars с помощью htmlspecialchars и / или strip_tags .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню