Использование DOMDocument для анализа HTML с помощью кода JS


Я беру 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();

}

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

Author: Yahel, 2011-03-20

1 answers

Поддельная "функция" CodeIgniter против XSS искажает ввод вашего скрипта до того, как DOMDocument увидит его. Теги скриптов и различные другие строки будут удалены, заменены на "[удалено]" и другие, в противном случае испорченные без уважительной причины. Увидеть system/libraries/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, если это не просто числовое или что-то в этом роде).

 2
Author: bobince, 2011-03-20 13:58:31