Biorę HTML jako ciąg, a następnie analizuję go, aby zmienić wszystkie linki href na coś innego. Działa to jednak, gdy strona HTML ma pewne znaczniki skryptu JS, tj. <script>
zostaje usunięty! Na przykład ten wiersz:
<script type="text/javascript" src="/js/jquery.js"></script>
Pobiera zmieniony na:
[removed][removed]
Chciałbym jednak zachować wszystko. To moja funkcja:
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();
}
Doceniam każdą pomoc w tej sprawie.
Odpowiedzi:
2 dla odpowiedzi № 1Fałszywą „funkcją” CodeIgniter jest „fałszowanie”dane wejściowe skryptu, zanim DOMDocument go obejrzy. Znaczniki skryptu i różne inne ciągi znaków zostaną usunięte, zastąpione przez „[usunięte]” inne w inny sposób pomieszane bez powodu. Zobacz system / libraries / Security.php moduł pełnych krępujących szczegółów.
Aby wyłączyć tę błędną funkcję, ustaw $config["global_xss_filtering"]= FALSE
. Musisz upewnić się, że twój skrypt jestoczywiście właściwie obsługuje łańcuchy ucieczki, oczywiście (np. zawsze wprowadzanie przez użytkownika znaków ucieczki HTML podczas dołączania do strony). Ale i tak musisz to zrobić; anti-XSS nie rozwiązuje problemów z przetwarzaniem tekstu, po prostu je zasłania.
$link->setAttribute("href", CLK_BASE."clk.php?i=$code_id&j=" . $link->getAttribute("href"));
Będziesz musiał urlencode
który getAttribute("href")
(i potencjalnie $ code_id, jeśli nie jest to tylko liczba lub coś takiego).