Использование DOMDocument для разбора HTML с кодом JS - PullRequest
2 голосов
/ 20 марта 2011

Я принимаю HTML как строку, а затем анализирую ее, чтобы заменить все ссылки href на что-то другое Это работает, однако, когда HTML-страница имеет некоторые теги JS-скрипта, т.е. <script>, она удаляется! Например, эта строка:

<script type="text/javascript" src="/js/jquery.js"></script>

Получает значение:

[removed][removed] 

Однако я хотел бы сохранить все в себе. Это моя функция:

function parse_html_code($code, $code_id){

libxml_use_internal_errors(true);

$xml = new DOMDocument();

$xml->loadHTML($code); 

foreach($xml->getElementsByTagName('a') as $link) {

  $link->setAttribute('href', CLK_BASE."clk.php?i=$code_id&j=" . $link->getAttribute('href'));

}

return $xml->saveHTML();

}

Я ценю любую помощь в этом.

1 Ответ

2 голосов
/ 20 марта 2011

Поддельная функция CodeIgniter anti-XSS 'определяет входные данные вашего скрипта до того, как DOMDocument увидит его.Теги сценариев и различные другие строки будут удалены, заменены на «[удалено]», что в противном случае будет бесполезно.Для получения полной информации см. Модуль system / library / Security.php.

Чтобы отключить эту ошибочную функцию, установите $config['global_xss_filtering']= FALSE.Конечно, вы должны будете убедиться, что ваш скрипт действительно обрабатывает экранирование строк (например, всегда экранирующий ввод пользователя HTML при включении в страницу).Но тогда вы все равно должны это сделать;anti-XSS не исправляет ваши проблемы с обработкой текста, он просто затеняет их.

$link->setAttribute('href', CLK_BASE."clk.php?i=$code_id&j=" . $link->getAttribute('href'));

Вам нужно будет urlencode это getAttribute('href') (и, возможно, $ code_id, если это не просто число или что-то еще)).

...