Использование 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();
}
Я ценю любую помощь в этом вопросе.
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, если это не просто числовое или что-то в этом роде).